Windows 10: Настройка OpenSSH

В прошлый раз я устранял ошибки при подключении к серверу OpenSSH на Windows 10. Там же я расписал шаги по установке этого компонента (OpenSSH) на Windows 10. Но это была дефолтовая установка. Сейчас я решил её допилить, чтобы была хоть какая-то защита.

Настройка Firewall на сервере

1. Откроем настройки брандмауэра (не нравится мне это слово, лучше всё же firewall).
Windows Defender Firewall with Advanced SecurityInbound RulesOpenSSH Server (sshd)ScopeRemote IP addressesThese IP addressesAdd…

Windows 10: Настройка OpenSSH
2. В диалоге выбора IP-адресов переключимся на третий вариант (Predefined set of computers) и выберем Local subnet:
Windows 10: Настройка OpenSSH

Можно конечно ограничиться вообще только одним IP-адресом компьютера админа, тогда все остальные будут получать ошибку:

PowerShell
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:

PowerShell
cd C:\Windows\System32\OpenSSH\

4. Запускаем утилиту для генерации ключей:

PowerShell
.\ssh-keygen.exe

Вывод будет таким:

PowerShell
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. Мы ничего вводить не будем, а просто нажмём клавишу Enter , т.о. ключи сохранятся в папку по умолчанию.

Если ключи в этой папке уже есть, будет предложено их перезаписать.

 

6. Введём кодовую фразу (passphrase) для шифрования файлов закрытого ключа.
Будет создана пара ключей — публичный и приватный:

PowerShell
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]-----+
После генерации мы получили пару ключей id_rsa (закрытый) и id_rsa.pub (открытый), они расположены в папке C:\Users\Admin\.ssh на локальном компьютере.

 

Безопасное хранение закрытых ключей

Для сохранения закрытых ключей в Windows реализована специальная служба

 

7. Запустим агент SSH (на клиентском компе в консоли PowerShell под админом):

PowerShell
Start-Service ssh-agent
В случае отключенной службы мы получим ошибку:

PowerShell
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

В этом случае нужно выставить режим запуска службы на ручной:

PowerShell
Get-Service -Name ssh-agent | Set-Service -StartupType Manual

 

8. Выполним проверку состояния службы:

PowerShell
Get-Service ssh-agent

Вывод должен быть таким:

PowerShell
PS C:\Windows\System32\OpenSSH> Get-Service ssh-agent

Status   Name               DisplayName
------   ----               -----------
Running  ssh-agent          OpenSSH Authentication Agent

9. Загрузим наши ключи в хранилище ssh-agent:

PowerShell
ssh-add.exe C:\Users\Admin\.ssh\id_rsa
Если воспользоваться командой из примера, то получим ошибку:

PowerShell
C:\Windows\System32\OpenSSH> ssh-add ~\.ssh\id_rsa
~\.ssh\id_rsa: No such file or directory

Так что придётся указывать полный путь. Сейчас нет времени разбираться, почему ssh-add не понимает ~

 

10. Мы успешно добавили закрытый ключ в ssh-agent, так что теперь файл нужно удалить (при необходимости можно сделать его резервную копию):

PowerShell
del C:\Users\Admin\.ssh\id_rsa

Использование открытых ключей

Как вы помните, у нас ещё остался файл открытого ключа: id_rsa.pub. Его мы скопируем на сервер SSH в папку C:\Users\Admin\.ssh\. Сделать это можно либо через программу удалённого управления типа AnyDesk, либо с помощью SCP:

PowerShell
scp -P 22 C:\Users\Admin\.ssh\id_rsa.pub admin@192.168.1.4:C:\Users\Admin\.ssh\authorized_keys

Вывод на экран должен быть примерно такой:

PowerShell
[\\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 на сервер, то получим примерно такой вывод:

PowerShell
[\\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

Здесь можно либо указать путь к нашему файлу ключей, либо наш файл переписать в эту папку с новым именем.

Если оставляете открытый ключ в файле administrators_authorized_keys, то на него нужно оставить доступ только группе Администраторы и SYSTEM, а группу «Авторизованные пользователи» убрать из доступа.

 

После этого нужно перезапустить службу OpenSSH SSH Server, либо через PowerShell (всё это на СЕРВЕРЕ!!!)

PowerShell
restart-service sshd

Решение проблем

Режим отладки на сервере включается в консоли PowerShell:

PowerShell
sshd.exe -d

Аналогично можно включить режим отладки на клиенте:

PowerShell
.\ssh 192.168.1.4 -p 22 -v

Лог будет достаточно длинный, но нам важны строчки об успешном коннекте:

PowerShell
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:

PowerShell
.\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 получаю ошибку:

Received disconnect from 192.168.1.254 port 22:2: Too many authentication failures for admin

 

Причём в этом случае я даже не успеваю ввести пароль — сразу выкидывает ошибку, а служба ssh-agent не запущена (так что вроде как и некому спамить ключами). Ладно, отключим авторизацию по ключам:

.\ssh 192.168.1.254 -l admin -o PubkeyAuthentication=no

Теперь должно сработать и нам предложат ввести пароль.



Подписаться
Уведомление о
guest
1 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Максим

Добрый день! Нашу компанию заинтересовал ваш сайт. Как мы могли бы пообщаться по поводу сотрудничества? Как вариант, мы хотели бы разместить статью на вашем сайте про наш. Ответьте пожалуйста на почту, если вас это заинтересовало, заранее спасибо!