Настроить безопасный удалённый доступ к серверу на базе Debian с использованием OpenSSH, ограничив доступ только одному пользователю ssh, реализовав переход от аутентификации по паролю к аутентификации по SSH-ключам, сгенерированным на клиентской машине под управлением Windows.
Все параметры конфигурации OpenSSH
// /etc/ssh/sshd_config - Конфигурационный файл для SSH-сервера (sshd) в OpenSSH.
// Каждый параметр указан с примером значения (часто по умолчанию) и описанием.
// Комментарии начинаются с //. Параметры нечувствительны к регистру.
// Для применения изменений: sudo systemctl restart ssh.
// 1. Основные параметры (протокол, порты, адреса)
Port 22 // Порт, на котором sshd слушает входящие соединения. Можно указать несколько портов в отдельных строках. Значения: число (1-65535). По умолчанию: 22.
ListenAddress 0.0.0.0 // IP-адреса и порты, на которых sshd слушает. Формат: [host|IPv6]:port. Если не указан, слушает на всех интерфейсах. Значения: IP или hostname с портом. По умолчанию: все доступные адреса.
AddressFamily any // Семейство адресов для прослушивания (IPv4, IPv6 или оба). Значения: any, inet (IPv4), inet6 (IPv6). По умолчанию: any.
Protocol 2 // Версия SSH-протокола. В новых версиях только SSHv2 поддерживается. Значения: 2 (только v2), 1 (устарел, небезопасен). По умолчанию: 2.
// 2. Аутентификация и доступ
PermitRootLogin prohibit-password // Разрешает ли прямой логин под root. Значения: yes, prohibit-password (только ключи), forced-commands-only (только команды), no. По умолчанию: prohibit-password.
PasswordAuthentication yes // Разрешает аутентификацию по паролю. Значения: yes/no. По умолчанию: yes.
PubkeyAuthentication yes // Разрешает аутентификацию по публичным ключам. Значения: yes/no. По умолчанию: yes.
HostbasedAuthentication no // Разрешает аутентификацию на основе хоста (rhosts с ключами). Значения: yes/no. По умолчанию: no.
PermitEmptyPasswords no // Разрешает логины с пустыми паролями (опасно!). Значения: yes/no. По умолчанию: no.
ChallengeResponseAuthentication yes // Разрешает клавиатурно-интерактивную аутентификацию (например, PAM). Значения: yes/no. По умолчанию: yes. (Синоним: KbdInteractiveAuthentication)
KerberosAuthentication no // Разрешает Kerberos-аутентификацию (GSSAPI). Значения: yes/no. По умолчанию: no (если не скомпилировано с поддержкой).
GSSAPIAuthentication no // Разрешает GSSAPI-аутентификацию (часто для Kerberos). Значения: yes/no. По умолчанию: no.
GSSAPICleanupCredentials yes // Удаляет credentials после аутентификации. Значения: yes/no. По умолчанию: yes.
UsePAM yes // Использует PAM для аутентификации (рекомендуется для Linux). Значения: yes/no. По умолчанию: yes (в большинстве дистрибутивов).
AllowUsers * // Список пользователей, которым разрешено подключаться. Формат: user[@host]. Значения: список через пробел. По умолчанию: все разрешены.
DenyUsers none // Список пользователей, которым запрещено подключаться. Аналогично AllowUsers. По умолчанию: нет.
AllowGroups none // Список групп, которым разрешено подключаться. Значения: список групп. По умолчанию: нет.
DenyGroups none // Список групп, которым запрещено подключаться. Аналогично AllowGroups. По умолчанию: нет.
MaxAuthTries 6 // Максимальное число попыток аутентификации на соединение. Значения: число. По умолчанию: 6.
LoginGraceTime 120 // Время (в секундах) на ввод пароля после подключения, иначе disconnect. Значения: число или 0 (без лимита). По умолчанию: 120.
MaxSessions 10 // Максимальное число сессий на соединение (для multiplexing). Значения: число. По умолчанию: 10.
MaxStartups 10:30:100 // Лимит одновременных неаутентифицированных подключений. Формат: start:rate:full. Значения: число или start:rate:full. По умолчанию: 10:30:100.
// 3. Шифрование и безопасность
Ciphers chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com // Список разрешенных шифров для SSHv2. Значения: список через запятую. По умолчанию: зависит от версии, обычно сильные шифры.
MACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com // Список Message Authentication Codes. Значения: список. По умолчанию: зависит от версии.
KexAlgorithms curve25519-sha256,curve448-sha512,diffie-hellman-group-exchange-sha256 // Алгоритмы обмена ключами. Значения: список. По умолчанию: зависит от версии.
HostKeyAlgorithms rsa-sha2-512,rsa-sha2-256,ssh-ed25519 // Алгоритмы хост-ключей. Значения: список. По умолчанию: зависит от версии.
PubkeyAcceptedKeyTypes ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256 // Разрешенные типы публичных ключей для аутентификации. Значения: список. По умолчанию: зависит от версии. (Синоним: PubkeyAcceptedAlgorithms)
RekeyLimit default none // Лимит для перегенерации ключей сессии (по объему данных или времени). Значения: default none или size [time] (например, 1G 1h). По умолчанию: default none.
IgnoreRhosts yes // Игнорирует файлы .rhosts и .shosts. Значения: yes/no. По умолчанию: yes.
IgnoreUserKnownHosts no // Игнорирует ~/.ssh/known_hosts для hostbased auth. Значения: yes/no. По умолчанию: no.
HostbasedUsesNameFromPacketOnly no // Использует имя хоста из пакета для hostbased auth. Значения: yes/no. По умолчанию: no.
StrictModes yes // Проверяет права доступа на файлы пользователя (например, ~/.ssh). Значения: yes/no. По умолчанию: yes.
PermitUserEnvironment no // Разрешает обработку ~/.ssh/environment. Значения: yes/no. По умолчанию: no.
DisableForwarding no // Отключает все виды forwarding (agent, X11, TCP). Значения: yes/no. По умолчанию: no.
// 4. Forwarding и туннелирование
AllowAgentForwarding yes // Разрешает forwarding SSH-агента. Значения: yes/no. По умолчанию: yes.
AllowTcpForwarding yes // Разрешает TCP-forwarding (локальное/динамическое/удаленное). Значения: yes, no, local, remote, all. По умолчанию: yes.
GatewayPorts no // Разрешает ли удаленные хосты подключаться к forwarded портам. Значения: no, yes, clientspecified. По умолчанию: no.
X11Forwarding no // Разрешает X11-forwarding. Значения: yes/no. По умолчанию: no.
X11DisplayOffset 10 // Начальный номер дисплея для X11-forwarding. Значения: число. По умолчанию: 10.
X11UseLocalhost yes // Bind X11-forwarding к localhost. Значения: yes/no. По умолчанию: yes.
PermitTunnel no // Разрешает tun-устройства для VPN-подобных туннелей. Значения: no, yes, point-to-point, ethernet. По умолчанию: no.
// 5. Логирование и отладка
LogLevel INFO // Уровень логирования. Значения: QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3. По умолчанию: INFO.
SyslogFacility AUTH // Facility для syslog. Значения: DAEMON, USER, AUTH, LOCAL0-LOCAL7 и т.д. По умолчанию: AUTH.
PrintMotd yes // Печатает /etc/motd при логине. Значения: yes/no. По умолчанию: yes.
PrintLastLog yes // Печатает дату последнего логина. Значения: yes/no. По умолчанию: yes.
// 6. Сессии и подсистемы
UseLogin no // Использует /bin/login для интерактивных сессий (устарел). Значения: yes/no. По умолчанию: no.
Compression delayed // Включает сжатие данных. Значения: yes, delayed, no. По умолчанию: delayed.
ClientAliveInterval 0 // Интервал (сек) отправки keepalive-сообщений клиенту. Значения: число (0 — отключено). По умолчанию: 0.
ClientAliveCountMax 3 // Максимум keepalive без ответа перед disconnect. Значения: число. По умолчанию: 3.
TCPKeepAlive yes // Отправляет TCP keepalive. Значения: yes/no. По умолчанию: yes.
IPQoS lowdelay throughput // Quality of Service для IP (DSCP). Значения: af11, af12 и т.д. или число. По умолчанию: lowdelay для интерактивных, throughput для bulk.
Subsystem sftp /usr/lib/openssh/sftp-server // Определяет подсистемы (например, sftp). Значения: name command. По умолчанию: sftp internal-sftp или внешний.
ChrootDirectory none // Chroot-директория для пользователя после логина. Значения: путь или none. По умолчанию: none.
ForceCommand none // Принудительно выполняет команду вместо shell. Значения: команда. По умолчанию: нет.
PermitTTY yes // Разрешает выделение TTY. Значения: yes/no. По умолчанию: yes.
StreamLocalBindMask 0177 // Маска прав для Unix-сокетов. Значения: octal (например, 0177). По умолчанию: 0177.
StreamLocalBindUnlink no // Удаляет существующий сокет перед bind. Значения: yes/no. По умолчанию: no.
// 7. Ключи и сертификаты
HostKey /etc/ssh/ssh_host_rsa_key // Путь к приватным хост-ключам. Значения: путь к файлу. По умолчанию: автоматически генерируются.
HostCertificate none // Путь к сертификату хоста. Значения: путь. По умолчанию: нет.
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 // Путь к файлу с authorized keys. Значения: путь. По умолчанию: .ssh/authorized_keys .ssh/authorized_keys2.
AuthorizedPrincipalsFile none // Файл с principals для CA. Значения: путь или none. По умолчанию: none.
AuthorizedKeysCommand none // Команда для получения authorized keys. Значения: команда. По умолчанию: нет.
TrustedUserCAKeys none // Путь к CA-ключам для user certs. Значения: путь. По умолчанию: нет.
RevokedKeys none // Путь к файлу с отозванными ключами. Значения: путь. По умолчанию: нет.
CASignatureAlgorithms rsa-sha2-256,rsa-sha2-512 // Алгоритмы для CA-подписей. Значения: список. По умолчанию: зависит от версии.
// 8. Другие параметры
PidFile /var/run/sshd.pid // Путь к PID-файлу sshd. Значения: путь. По умолчанию: /var/run/sshd.pid.
UseDNS no // Выполняет reverse DNS для клиентов. Значения: yes/no. По умолчанию: no (в новых версиях).
Banner none // Путь к файлу с баннером перед логином. Значения: путь или none. По умолчанию: none.
AcceptEnv LANG LC_* // Переменные окружения, которые клиент может отправить. Значения: список. По умолчанию: нет.
SetEnv none // Устанавливает переменные окружения для сессии. Значения: NAME=value. По умолчанию: нет.
ExposeAuthInfo no // Экспонирует информацию об аутентификации в $SSH_USER_AUTH. Значения: yes/no. По умолчанию: no.
ModuliFile /etc/ssh/moduli // Путь к файлу с DH moduli. Значения: путь. По умолчанию: /etc/ssh/moduli.
VersionAddendum none // Добавка к версии в идентификации. Значения: строка или none. По умолчанию: none.
// 9. Условные блоки (Match)
// Match User bob // Условные блоки для переопределения параметров на основе критериев (user, group, host, address и т.д.). Пример: Match User bob ... параметры ... Значения: критерии и вложенные параметры. По умолчанию: нет.
apt update // Обновляем пакеты
apt install sudo // Устанавливаем sudo
adduser ssh // Создаём нового пользователя "ssh" - Пароль: difpass123
adduser ssh sudo // Добавляем "ssh" в группу "sudo"
Выходим из root и заходим под пользователем ssh
Прописываем su -l и вводим пароль от пользователя root
Мы должны попасть в пользователя root
root@DC1:~#
Теперь приступаем к установке OpenSSH
apt install openssh-server -y // Устанавливаем пакет OpenSSH
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak // Делаем копию файла конфигурации
Редактируем конфиг:
nano /etc/ssh/sshd_config
Очищаем конфиг и пишем следующие параметры:
Port 2222 # Порт меняем с 22 на любой другой (у нас 2222):
AllowUsers ssh # Разрешаем только пользователя ssh
PasswordAuthentication yes # Включаем вход по паролю (временно)
PubkeyAuthentication yes
PermitRootLogin no # Отключаем вход root'а (рекомендуется)
Сохраняем и выходим из конфига.
Проверяем синтаксис и перезапускаем ssh
sshd -t // Не должно быть ошибок
systemctl restart ssh // Перезапуск ssh
Идём на ВМ с Windows и заходим под Administrator
Скачиваем и устанавливаем PuTTY
MSI (‘Windows Installer’)
64-bit x86:
Выполняем проверку работы ssh
Открываем PuTTY и заходим на наш сервер
Host Name (or IP address): ssh@10.0.2.3
Port: 2222
Connection type: SSH
Так же вместо IP можно прописать домен
nkestudy.localssh@nkestudy.local
Жмём Open

Принимаем отпечаток, жмём Accept

Попадаем в нашу оболочку сервера, проходим аутентификацию как обычно

Проверка выполнена, подключение по паролю работает, но это не безопасный способ подключения, ведь его можно сбрутфорсить.
Настроим аутентификацию по ключам, она безопаснее.
Открываем PuTTYgen, мы его установили вместе с PuTTY
Жмём Genereted И начинаем двигаем мышкой по окну
Это своеобразный способ создания ключа, если мышкой не двигать процесс не будет заполняться!
Сохраняем Private Key на рабочий стол с любым названием
Далее копируем всё, что есть в окне Public key for pasting intro OpenSSH authorized_keys file:
Самое большое окно в приложении
На всякий случай сохраняем в документе на рабочем столе, чтобы не потерять.
Далее через текущую сессию SSH создаём папку для ключа и вставляем его:
su -l
mkdir -p ~ssh/.ssh
nano ~ssh/.ssh/authorized_keys
Вставьте скопированный публичный ключ → сохраните.
После выдаём права на доступ к файлу и папкам:
chown -R ssh:ssh ~ssh/.ssh
chmod 700 ~ssh/.ssh
chmod 600 ~ssh/.ssh/authorized_keys
Далее идём в конфигурацию и отключаем пароли, оставляем только ключи:
nano /etc/ssh/sshd_config
Меняем параметр PasswordAuthentication с yes на no
Перезагружаем ssh.
systemctl restart ssh
Закрываем PuTTY и снова открываем
Вводим наши данные и дальше идём во вкладку SSH → Auth → Credentials
Там ставим наш приватный ключ который сохраняли на рабочем столе.

После идём во вкладку Session → Saved Session (вводим название) и жмём Save
После выбираем нашу сессию и жмём Load
Потом Open

Вуаля мы зашли без пароля!
OpenSSH по умолчанию используют только SSHv2, а SSHv1 считается небезопасным?MaxStartups 10:30:100 в sshd_config определяет поведение при перегрузке. Объясните, что произойдёт при 15 одновременных неаутентифицированных подключениях?AllowTcpForwarding по умолчанию включён. Назовите потенциальные угрозы, если его не отключить на публичном сервере, и как их минимизировать.SSH вы видите в логах данную ошибку. Объясните причину и точные команды для исправления.Authentication refused: bad ownership or modes for directory /home/user/.ssh