Как настроить OpenSSH на сервере Windows [Полное руководство]

Протокол Secure Shell (SSH) и проект OpenSSH существуют на Linux уже несколько десятилетий. Однако OpenSSH на Windows не был широко принят в мире Windows до недавнего времени. Поэтому сервер Windows обычно не поставляется готовым к использованию и требует настройки.

В этом уроке вы узнаете, как подключиться к вашему серверу Windows по SSH так же легко, как к Linux. Вы узнаете, как установить (или обновить) OpenSSH на Windows, добавить соответствующие правила брандмауэра и настроить аутентификацию на основе открытого ключа, пароля и сертификата.

Предварительные требования

Чтобы эффективно следовать примерам и демонстрациям в этой статье, вам нужно выполнить следующие требования.

  • A Windows Server machine – This article will use Windows Server 2019 Datacenter. The server this tutorial will use will have a user account called june and will connect to the server at the IP address of 40.117.77.227 with a hostname of ataWindows.
  • A local computer with PowerShell 7.1 installed. PowerShell 7.1 is available in Windows, Linux, and macOS. The examples in this article use PowerShell 7.1 in Windows 10.

Загрузка OpenSSH

В отличие от серверов Linux, серверы Windows не имеют встроенного SSH-сервера. Но Microsoft выпустила порт OpenSSH для Windows в открытом доступе. С помощью этого релиза вы теперь можете настроить SSH-сервер на компьютере с Windows.

Чтобы начать, вам сначала нужно скачать OpenSSH. Для этого выполните следующие шаги:

  1. Подключитесь к рабочему столу на сервере Windows с помощью удаленного рабочего стола (RDP) или предпочитаемого клиента управления рабочим столом.

2. На рабочем столе вашего сервера Windows откройте консоль Windows PowerShell с повышенными правами.

3. Затем скопируйте нижеприведенный код, вставьте его в окно PowerShell и нажмите Enter. Этот скрипт загрузит последнюю версию OpenSSH, которая, на момент написания, является версией v8.1.0.0p1-Beta, в текущий рабочий каталог.

Если вы хотите сохранить код PowerShell для загрузки OpenSSH, вы также можете открыть редактор кода, такой как Windows PowerShell ISE или Visual Studio Code, и сохранить его там.

## Установите протокол сетевого подключения на TLS 1.2
## Укажите URL последней версии OpenSSH
 $url = 'https://github.com/PowerShell/Win32-OpenSSH/releases/latest/'
## Создайте веб-запрос для получения ссылки на загрузку последней версии
 $request = [System.Net.WebRequest]::Create($url)
 $request.AllowAutoRedirect=$false
 $response=$request.GetResponse()
 $source = $([String]$response.GetResponseHeader("Location")).Replace('tag','download') + '/OpenSSH-Win64.zip'
## Загрузите последнюю версию пакета OpenSSH для Windows в текущий рабочий каталог
 $webClient = [System.Net.WebClient]::new()
 $webClient.DownloadFile($source, (Get-Location).Path + '\OpenSSH-Win64.zip')

4. Файл OpenSSH-Win64.zip теперь должен находиться в текущем рабочем каталоге. Проверьте это, запустив нижеприведенную команду.

Get-ChildItem *.zip

Как видно ниже, файл OpenSSH-Win64.zip существует в каталоге.

Checking if the OpenSSH zip file exists

Установка OpenSSH

После того, как вы загрузили OpenSSH-Win64.zip, следующим шагом будет установка OpenSSH на сервере. Здесь нет мастера установки, если вы этого ожидаете.

  1. В то время как остаетесь в той же сессии PowerShell, скопируйте и запустите следующий код в PowerShell. Этот код извлекает содержимое файла OpenSSH-Win64.zip в C:\Program Files\OpenSSH.
# Извлечь ZIP во временное местоположение
 Expand-Archive -Path .\OpenSSH-Win64.zip -DestinationPath ($env:temp) -Force
# Переместить извлеченное содержимое ZIP из временного местоположения в C:\Program Files\OpenSSH\
 Move-Item "$($env:temp)\OpenSSH-Win64" -Destination "C:\Program Files\OpenSSH\" -Force
# Разблокировать файлы в C:\Program Files\OpenSSH\
 Get-ChildItem -Path "C:\Program Files\OpenSSH\" | Unblock-File

2. После извлечения ZIP-файла выполните следующую команду в PowerShell для запуска скрипта C:\Program Files\OpenSSH\install-sshd.ps1. Этот скрипт устанавливает службу сервера SSH (sshd) OpenSSH и службу агента аутентификации OpenSSH (sshd-agent).

& 'C:\Program Files\OpenSSH\install-sshd.ps1'

Вы можете увидеть ожидаемый результат ниже.

Installing OpenSSH

Чтобы убедиться, что сервер SSH запускается автоматически, выполните следующую команду в PowerShell.

## изменяет тип запуска службы sshd с ручного на автоматический.
 Set-Service sshd -StartupType Automatic
## запускает службу sshd.
 Start-Service sshd

Добавление правила брандмауэра Windows для разрешения трафика SSH

Эта процедура применима только, если ваш сервер Windows использует брандмауэр Windows. Для серверов с использованием брандмауэров сторонних производителей обратитесь к документации вашего брандмауэра по разрешению порта 22.

Установка OpenSSH не автоматически создает правило исключения брандмауэра для разрешения трафика SSH. Поэтому вашим следующим заданием будет создание правила брандмауэра вручную.

Один из самых простых способов создать новое правило брандмауэра Windows с помощью PowerShell и командлета New-NetFirewallRule . Ниже приведена команда, которая создает правило брандмауэра с именем Allow SSH, разрешающее всем входящим TCP-трафик на порт 22.

Скопируйте указанную ниже команду и выполните ее в PowerShell.

New-NetFirewallRule -Name sshd -DisplayName 'Allow SSH' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

На скриншоте ниже показан ожидаемый результат в PowerShell после создания правила брандмауэра.

Creating a Windows Firewall Rule to allow Port 22

Подключение с использованием SSH и аутентификации по паролю

На этом этапе вы установили OpenSSH на Windows и выполнили начальную настройку сервера. Следующим шагом будет проверка, действительно ли работает подключение по SSH.

Чтобы протестировать ваш вновь настроенный SSH-сервер, давайте запустим команду ssh на вашем локальном компьютере.

Те же самые шаги в этом разделе также применяются при подключении к серверу SSH Linux.

1. На этот раз с вашего локального компьютера откройте PowerShell.

2. Затем выполните указанную ниже команду для запуска процесса входа по SSH. Убедитесь, что изменены имя пользователя и удаленный хост вашего сервера Windows.

ssh june@40.117.77.227

3. Поскольку вы подключаетесь к серверу впервые, вы увидите приглашение, говорящее о том, что подлинность хоста не может быть установлена. Это сообщение означает, что ваш компьютер еще не распознает удаленный хост. Введите yes и нажмите Enter, чтобы продолжить.

4. Когда вас попросят ввести пароль, введите пароль вашей учетной записи и нажмите Enter.

Connecting via SSH using Password Authentication

5. После входа в систему, как видно на скриншоте ниже, вы окажетесь в командной строке удаленного хоста. Предположим, вы хотите подтвердить, что вы вошли в сеанс на удаленном хосте. Для этого введите hostname и нажмите Enter. Команда должна вернуть имя удаленного компьютера.

Getting the hostname of the SSH server

Изменение стандартной оболочки для OpenSSH на PowerShell

Когда вы впервые вошли на ваш сервер SSH Windows, вы заметите, что стандартная оболочка или интерпретатор команд – CMD. Иметь CMD в качестве стандартной оболочки SSH вполне нормально, но если вы предпочитаете использовать в качестве стандартной оболочки PowerShell, следуйте этим шагам.

Чтобы изменить стандартную оболочку OpenSSH с CMD на PowerShell:

Сначала откройте повышенное окно PowerShell на вашем сервере Windows, если у вас еще его нет.

Затем создайте новое строковое значение реестра с именем DefaultShell в ключе реестра HKLM:\SOFTWARE\OpenSSH. Установите данные строки DefaultShell на путь к Windows PowerShell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

На скриншоте ниже показан ожидаемый результат команды.

Changing the default OpenSSH shell

Настройка аутентификации с открытым ключом

На предыдущих этапах вы подключались с помощью имени пользователя и пароля. Это работает, но более безопасным способом аутентификации на сервере SSH является использование пары ключей.

В двух словах, пара ключей состоит из двух ключей, называемых открытым ключом и закрытым ключом, которые представляют собой набор учетных данных безопасности для подтверждения вашей личности.

Открытый ключ хранится на сервере, в то время как закрытый ключ остается на локальном компьютере. Вы должны обращаться к закрытому ключу так же, как к своему паролю. Если закрытый ключ скомпрометирован, любой может использовать его для доступа к вашему серверу SSH.

Подготовка файла administrators_authorized_keys

Открытые ключи должны находиться на сервере. Но где именно? Для OpenSSH на Windows сервер SSH считывает открытые ключи из файла C:\ProgramData\ssh\administrators_authorized_keys. Однако этот файл по умолчанию не существует. Его необходимо создать первым.

Следуйте этим шагам, чтобы создать файл administrators_authorized_keys и установить его правильный список контроля доступа (ACL).

На сервере Windows:

1. Откройте повышенную консоль Windows PowerShell, если еще не открыта.

2. Скопируйте и выполните следующую команду в PowerShell. Эта команда создает файл administrators_authorized_keys с использованием New-Item cmdlet.

New-Item -Type File -Path C:\ProgramData\ssh\administrators_authorized_keys

Вы должны увидеть результат, аналогичный скриншоту ниже.

Creating the administrators_authorized_keys file

3. Затем получите текущий ACL, назначенный файлу ssh_host_dsa_key, и скопируйте этот ACL в файл administrators_authorized_keys. Для этого выполните следующую команду.

get-acl C:\ProgramData\ssh\ssh_host_dsa_key | set-acl C:\ProgramData\ssh\administrators_authorized_keys

Сервис OpenSSH требует, чтобы к файлу administrators_authorized_keys имели доступ только группа Администраторы и учетная запись SYSTEM. Копирование ACL файла ssh_host_dsa_key в administrators_authorized_keys имеет смысл, потому что ACL уже установлен.

4. Теперь откройте проводник Windows.

5. Перейдите в папку C:\ProgramData\ssh\.

6. Щелкните правой кнопкой мыши по файлу administrators_authorized_keys и выберите Свойства.

7. На странице свойств перейдите на вкладку Безопасность и нажмите Дополнительно.

Opening advanced security settings

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

Viewing advanced security permission

Генерация новой пары ключей SSH

Для генерации новой пары ключей SSH используйте команду ssh-keygen, которая является частью инструментов клиента OpenSSH, встроенных в Windows 10 (и выше) и большинство операционных систем Linux.

Приведенный в этом разделе пример работает как на компьютерах с Windows, так и на компьютерах с Linux.

На вашем локальном компьютере в консоли PowerShell:

1. Перейдите в домашнюю папку с помощью команды ниже в папке .ssh.

cd ~/.ssh

2. Далее введите команду ssh-keygen и нажмите Enter. Когда будет предложено ввести расположение файла для сохранения создаваемого ключа, оставьте его по умолчанию и нажмите Enter. Это позволит вашему SSH-клиенту автоматически находить ваши SSH-ключи при аутентификации.

В Windows файл ключа по умолчанию находится по пути C:\Users\<username>\.ssh\id_rsa.

3. На следующем запросе оставьте пароль пустым. На этом этапе для тестирования пароль использовать не обязательно.

Добавление пароля к вашему закрытому ключу значительно повышает его безопасность. Пароль действует как двухфакторная аутентификация (2FA) для вашего закрытого ключа.

Обратите внимание, что эта команда создала два файла; id_rsa (закрытый ключ) и id_rsa.pub (открытый ключ).

Generating a new SSH key pair on the local computer

Развертывание открытого ключа на сервере SSH Windows

Теперь, когда вы сгенерировали свою пару закрытый-открытый ключ, следующим шагом будет копирование открытого ключа в файл C:\ProgramData\ssh\administrators_authorized_keys на сервере SSH.

На вашем локальном компьютере в консоли PowerShell:

1. Скопируйте код ниже и выполните его в PowerShell. Обязательно замените имя пользователя и IP-адрес. Вы можете обратиться к комментарию перед каждой командой, чтобы узнать, что делает каждая команда.

# Прочитать открытый ключ
 $public_key = Get-Content ~/.ssh/id_rsa.pub
# Добавить открытый ключ в administrators_authorized_keys на сервере с помощью ssh.
 ssh june@40.177.77.227 "'$($public_key)' | Out-File C:\ProgramData\ssh\administrators_authorized_keys -Encoding UTF8 -Append"

2. Введите пароль, когда будет запрос, и ssh продолжит копирование открытого ключа. Вы увидите аналогичный результат, как показано ниже.

Deploying the public key to the Windows SSH server

Подключение по SSH с использованием аутентификации по открытому ключу

Теперь, когда вы скопировали свой открытый ключ на свой SSH-сервер, вам больше не нужно использовать пароль для аутентификации. Как видите ниже, ssh не запросил пароль.

Connecting with SSH using Public Key Authentication

Настройка аутентификации по сертификату

Как и при аутентификации по открытому ключу, аутентификация по сертификату не требует пароля или защиты паролем. Чтобы включить вход по сертификату, выполните ту же процедуру генерации ключевой пары, пропустив развертывание открытого ключа на SSH-сервер.

Вам не нужно отображать открытый ключ в файлах authorized_keys или administrators_authorized_keys на SSH-сервере. Вместо этого открытый ключ подписывается с использованием ключа центра сертификации (ЦС).

Создание ключа центра сертификации (ЦС)

Генерация ключей ЦС для подписи аналогична генерации пользовательской ключевой пары, которую вы выполнили ранее в этой статье. На этот раз вам нужно указать имя файла для новых ключей ЦС. Для этого на вашем сервере Windows в консоли PowerShell:

Выполните команду ssh-keygen, как показано ниже. Эта команда создает CA-ключ в C:\ProgramData\ssh\ca_userkeys, но не стесняйтесь использовать другое имя файла. Использование другого имени файла не повлияет на функциональность CA-ключа.

Когда спросят пароль, оставьте его пустым и нажмите Enter.

ssh-keygen -f C:\ProgramData\ssh\ca_userkeys

Вы можете видеть ниже, что команда создала два файла. ca_userkeys, который является закрытым ключом, и ca_userkeys.pub, который является открытым ключом.

Creating the Certificate Authority (CA) Key on a Windows SSH server

Теперь, когда вы создали CA-ключи, сообщите SSH-серверу, чтобы он доверял CA и знал, где находится CA-ключ. Для этого добавьте новую строку TrustedUserCAKeys путь/к/ca_userkeys.pub в файл C:\ProgramData\ssh\sshd_config на сервере.

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

# Если SSH-сервер работает под управлением Windows
 echo TrustedUserCAKeys C:\ProgramData\ssh\ca_userkeys.pub>> C:\ProgramData\ssh\sshd_config

Подписание открытого ключа пользователя

На этом этапе вы создали CA-ключи и настроили SSH-сервер на доверие открытому ключу CA. Теперь осталось подписать открытый ключ пользователя.

На вашем локальном компьютере, в консоли PowerShell:

1. Скопируйте файл id_rsa.pub на ваш домашний диск на SSH-сервере, используя команду SCP. Убедитесь, что заменили имя пользователя и IP-адрес на правильные значения.

scp ((Resolve-Path ~/.ssh/id_rsa.pub).Path) june@40.117.77.227:id_rsa.pub

2. Войдите на свой сервер Windows, используя ssh. После входа выполните ssh-keygen, чтобы подписать открытый ключ пользователя. Вы заметите, что ниже приведена команда с использованием нескольких параметров. Давайте разберем их.

  • -s C:\ProgramData\ssh\ca_userkeys – укажите местоположение ключа ЦС для подписи открытого ключа. В этом примере ключ ЦС – тот, который вы сгенерировали.
  • -I id_username – укажите ID, который вы хотите присвоить подписанному открытому ключу пользователя. Измените значение id_username на любое имя, которое вы хотите.
  • -V +4w – этот параметр указывает срок действия подписанного ключа. В этом примере +4w означает, что подписанный пользовательский ключ будет действителен в течение четырех недель. Вы можете изменить это значение на желаемый срок действия.
  • -n username – это имя пользователя, которому будет принадлежать подписанный открытый ключ.
  • <путь к id_rsa.pub> – это местоположение открытого ключа пользователя для подписи (Windows).
ssh-keygen -s C:\ProgramData\ssh\ca_userkeys -I id_username -V +4w -n username ~/id_rsa.pub

После выполнения этой команды в вашей сессии SSH вы должны получить подобный вывод, как показано ниже. Как видите, команда сгенерировала новый файл с именем id_rsa-cert.pub, который является подписанным пользовательским сертификатом.

Signing the User Key

3. Теперь вернитесь в сеанс PowerShell на вашем локальном компьютере и скопируйте файл id_rsa-cert.pub с сервера на ваш локальный компьютер. Сначала измените имя пользователя и IP-адрес на корректные значения, прежде чем выполнить команду.

scp june@40.117.77.227:id_rsa-cert.pub ((Resolve-Path ~/.ssh/).Path)

После завершения копирования вы найдете подписанный пользовательский сертификат в своей домашней папке, как показано ниже.

Finding the SSH user certificate

Подключение через SSH с использованием аутентификации по сертификатам

Переключились на аутентификацию по сертификату и теперь у вас есть пользовательский сертификат. Теперь нужно проверить, сможете ли вы подключиться к серверу SSH с использованием аутентификации по сертификату.

Команда для подключения к SSH с использованием сертификата такая же, как при использовании пароля или открытого ключа. Однако, если вы ранее включили аутентификацию по открытому ключу, сначала отключите её. В противном случае ssh будет продолжать использовать вашу пару ключей вместо вашего сертификата.

Для отключения пары ключей удалите свой открытый ключ из файла administrators_authorized_keys. Для этого выполните следующие шаги.

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

Находясь в системе через SSH на сервере Windows:

1. Выполните следующий код в PowerShell, чтобы очистить файл administrators_authorized_keys.

# Очистить файл administrators_authorized_keys
 $NULL > C:\ProgramData\ssh\administrators_authorized_keys
# Подтвердите, что administrators_authorized_keys пуст
 Get-Content C:\ProgramData\ssh\administrators_authorized_keys

2. На данном этапе файлы authorized_keys и administrators_authorized_keys пусты, как видно на скриншоте ниже.

Emptying the administrators_authorized_keys

3. Введите exit и нажмите Enter, чтобы отключиться от сеанса SSH. Вы вернетесь к сеансу PowerShell.

4. После удаления открытых ключей ваша следующая попытка входа через SSH будет использовать аутентификацию по сертификату. Впечатление от входа будет таким же, как при аутентификации по открытому ключу.

Connecting with SSH using Certificate Authentication

Заключение

Теперь вы настроили сервер OpenSSH для Windows с нуля и даже исследовали и настроили различные средства аутентификации. Теперь вы можете подключаться к своим серверам Windows точно так же, как с Linux!

Source:
https://adamtheautomator.com/openssh-windows/