Архив за месяц: Июнь 2021



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…


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

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

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

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

 

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

 

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

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

 

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»
Здесь мы разрешим авторизацию по ключам и запретим авторизацию по паролю:

PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords 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 (всё это на СЕРВЕРЕ!!!)

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