В прошлый раз я устранял ошибки при подключении к серверу OpenSSH на Windows 10. Там же я расписал шаги по установке этого компонента (OpenSSH) на Windows 10. Но это была дефолтовая установка. Сейчас я решил её допилить, чтобы была хоть какая-то защита.
Настройка Firewall на сервере
1. Откроем настройки брандмауэра (не нравится мне это слово, лучше всё же firewall).
▶ ▶ ▶ ▶ ▶ ▶
2. В диалоге выбора IP-адресов переключимся на третий вариант (Predefined set of computers) и выберем Local subnet:
PS C:\Windows\System32\OpenSSH> .\ssh 192.168.1.4 -p 22 ssh: connect to host 192.168.1.4 port 22: Connection timed out
Создание ключей пользователя
Мы находимся на компьютере с которого будем логинится на сервер OpenSSH. Здесь нам нужно сгенерировать аутентификационные ключи, поэтому переходим к следующему шагу.
3. Переходим в папку OpenSSH:
cd C:\Windows\System32\OpenSSH\
4. Запускаем утилиту для генерации ключей:
.\ssh-keygen.exe
Вывод будет таким:
PS C:\Windows\System32\OpenSSH> .\ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Admin/.ssh/id_rsa):
5. Мы ничего вводить не будем, а просто нажмём клавишу
6. Введём кодовую фразу (passphrase) для шифрования файлов закрытого ключа.
Будет создана пара ключей — публичный и приватный:
PS C:\Windows\System32\OpenSSH> .\ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Admin/.ssh/id_rsa):
C:\Users\Admin/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\Admin/.ssh/id_rsa.
Your public key has been saved in C:\Users\Admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:3mmo0ncL25SQ+g5iqIQDFTNr6LfQGplb5auMJHsrJa8 Admin@Notebook
The key's randomart image is:
+---[RSA 3072]----+
| + |
| . = |
|. + . |
|.o+ o . |
|.* + . S |
|+ O.. .o + o |
|+O..ooo + * |
|=+=.o..+.*. |
|E=.+ ..o+.o. |
+----[SHA256]-----+
Безопасное хранение закрытых ключей
7. Запустим агент SSH (на клиентском компе в консоли PowerShell под админом):
Start-Service ssh-agent
Start-Service : Service 'OpenSSH Authentication Agent (ssh-agent)' cannot be started due to the following error: Cannot start service ssh-agent on computer '.'. At line:1 char:1 + Start-Service ssh-agent + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service], ServiceCommandException + FullyQualifiedErrorId : CouldNotStartService,Microsoft.PowerShell.Commands.StartServiceCommand
В этом случае нужно выставить режим запуска службы на ручной:
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
8. Выполним проверку состояния службы:
Get-Service ssh-agent
Вывод должен быть таким:
PS C:\Windows\System32\OpenSSH> Get-Service ssh-agent
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
9. Загрузим наши ключи в хранилище ssh-agent:
ssh-add.exe C:\Users\Admin\.ssh\id_rsa
C:\Windows\System32\OpenSSH> ssh-add ~\.ssh\id_rsa ~\.ssh\id_rsa: No such file or directory
Так что придётся указывать полный путь. Сейчас нет времени разбираться, почему ssh-add не понимает ~
10. Мы успешно добавили закрытый ключ в ssh-agent, так что теперь файл нужно удалить (при необходимости можно сделать его резервную копию):
del C:\Users\Admin\.ssh\id_rsa
Использование открытых ключей
Как вы помните, у нас ещё остался файл открытого ключа: id_rsa.pub. Его мы скопируем на сервер SSH в папку C:\Users\Admin\.ssh\. Сделать это можно либо через программу удалённого управления типа AnyDesk, либо с помощью SCP:
scp -P 22 C:\Users\Admin\.ssh\id_rsa.pub admin@192.168.1.4:C:\Users\Admin\.ssh\authorized_keys
Вывод на экран должен быть примерно такой:
[\\Admin@Clientcomp] C:\Windows\System32\OpenSSH> scp -P 22 C:\Users\Admin\.ssh\id_rsa.pub admin@192.168.1.4:C:\Users\Admin\.ssh\authorized_keys
id_rsa.pub 100% 568 92.5KB/s 00:00
Если файл копировали через AnyDesk, то после того, как файл скопировали, его нужно переименовать на authorized_keys. Можно сразу переименовать, а потом скопировать — здесь я написал так, чтобы не было путаницы с именами.
Если теперь попытаться подключиться с клиентской машины по SSH на сервер, то получим примерно такой вывод:
[\\CLIENTCOMP] C:\Windows\system32\OpenSSH> .\ssh 192.168.1.4 -p 22
The authenticity of host '[192.168.1.4]:22 ([192.168.1.4]:22)' can't be established.
ECDSA key fingerprint is SHA256:EJWy+91UYxn5ppBlEILm2XNK9WXx6dgAGJPxRr/oPCY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.1.4]:22' (ECDSA) to the list of known hosts.
После этого мы уже будем залогинены на сервере (при этом IP нашего сервера будет добавлен в список в файле known_hosts).
Файл конфигурации сервера OpenSSH
Настройки сервера OpenSSH в Windows хранятся в следующем файле:
«C:\ProgramData\ssh\sshd_config»
Здесь мы разрешим авторизацию по ключам и запретим авторизацию по паролю:
StrictModes no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
Можно сменить порт с дефолтового 22 на какой-то другой:
Port 2232
Хотел написать про отдельную настройку в файле «C:\ProgramData\ssh\sshd_config». Речь идёт о «Match Group administrators». В текущей версии OpenSSH (OpenSSH.Server~~~~0.0.1.0 и OpenSSH.Client~~~~0.0.1.0) коннект под Админом работает без неё, но вдруг…
Опция AuthorizedKeysFile
Если наш пользователь входит в группу администраторов, то для них нужен отдельный файл ключей (актуально для Windows редакции 1809 и выше):
C:\ProgramData\ssh\administrators_authorized_keys
Обратите внимание, что если пользователь входит в группу администраторов, используется %programdata%/ssh/administrators_authorized_keys.
MSDN
Если админ единственный, то можно изменить путь к его папке профиля. Для этого нужно снять комментарий и изменить путь в следующем конфигурационном файле:
«C:\ProgramData\ssh\sshd_config»
В самом конце находятся строчки:
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
Это как раз наш файл:
C:\ProgramData\ssh\administrators_authorized_keys
Здесь можно либо указать путь к нашему файлу ключей, либо наш файл переписать в эту папку с новым именем.
После этого нужно перезапустить службу OpenSSH SSH Server, либо через PowerShell (всё это на СЕРВЕРЕ!!!)
restart-service sshd
Решение проблем
Режим отладки на сервере включается в консоли PowerShell:
sshd.exe -d
Аналогично можно включить режим отладки на клиенте:
.\ssh 192.168.1.4 -p 22 -v
Лог будет достаточно длинный, но нам важны строчки об успешном коннекте:
debug1: Authentications that can continue: publickey,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: C:\\Users\\Admin/.ssh/id_rsa RSA SHA256:lYYjSR1WExXA8BhOPgZj+3nUPTRZtF4d92fsEWqc+BU agent
debug1: Server accepts key: C:\\Users\\Admin/.ssh/id_rsa RSA SHA256:lYYjSR1WExXA8BhOPgZj+3nUPTRZtF4d92fsEWqc+BU agent
debug1: Authentication succeeded (publickey).
Authenticated to 192.168.1.4 ([192.168.1.4]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: ENABLE_VIRTUAL_TERMINAL_INPUT is supported. Reading the VTSequence from console
debug1: ENABLE_VIRTUAL_TERMINAL_PROCESSING is supported. Console supports the ansi parsing
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
Удалить ранее сохранённые открытые ключи из хранилища OpenSSH Authentication Agent:
.\ssh-add.exe -D
Ошибка username@192.168.1.4: Permission denied (publickey)
Эту ошибку я вынес в отдельный подзаголовок, т.к. сам попадался несколько раз!
Если имя локального пользователя отличается от имени пользователя удалённого компьютера, то может возникнуть такая ошибка:
username@192.168.1.4: Permission denied (publickey)
При этом в логах будет запись:
debug1: Authentications that can continue: publickey
debug1: Trying private key: C:\\Users\\username/.ssh/id_rsa
debug1: Trying private key: C:\\Users\\username/.ssh/id_dsa
debug1: Trying private key: C:\\Users\\username/.ssh/id_ecdsa
debug1: Trying private key: C:\\Users\\username/.ssh/id_xmss
debug1: No more authentication methods to try.
username@192.168.1.4: Permission denied (publickey).
Проблема в том, что на удалённой машине нет этого пользователя (хотя странно, что об этом не пишется в логах). В нашем случае придётся указывать его вручную:
.\ssh 192.168.1.4 -l Administrator -p 22
Либо так:
.\ssh Administrator@192.168.1.4 -p 22 -v
После этого ввести пароль пользователя Administrator удалённого компьютера.
Не работает настроенное отображение командной строки
Если для удалённого компьютера (по OpenSSH) правила отображения не сработали, то есть вероятность, что дефолтовый шелл у вас не PowerShell, а обычная консоль. Попробуйте проверить, просто набрав в той консоли powershell. Если после этого откроется консоль PowerShell и будет работать корректное отображение приглашения со всей расцветкой, то на сервере нужно будет поменять дефолтовый шелл для OpenSSH:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShellCommandOption -Value "/c" -PropertyType String -Force
Ошибка Too many authentication failures for admin
При попытке подключиться к роутеру по SSH получаю ошибку:
Причём в этом случае я даже не успеваю ввести пароль — сразу выкидывает ошибку, а служба ssh-agent не запущена (так что вроде как и некому спамить ключами). Ладно, отключим авторизацию по ключам:
.\ssh 192.168.1.254 -l admin -o PubkeyAuthentication=no
Теперь должно сработать и нам предложат ввести пароль.
- WordPress: Очистить от мусора WPDiscuz - 12.05.2025
- WPF: Не обновляется привязка к TextBox - 29.04.2025
- GitHub Desktop: Ошибка при попытке отправки коммита - 28.03.2025
Добрый день! Нашу компанию заинтересовал ваш сайт. Как мы могли бы пообщаться по поводу сотрудничества? Как вариант, мы хотели бы разместить статью на вашем сайте про наш. Ответьте пожалуйста на почту, если вас это заинтересовало, заранее спасибо!