В прошлый раз я устранял ошибки при подключении к серверу 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
Теперь должно сработать и нам предложат ввести пароль.
- C#: Сравнить два массива - 12.12.2024
- EVE-Online: Фильтры каналов - 23.11.2024
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024