Настройка SSH аутентификации по ключам в Windows

В этой статье мы настроим SSH аутентификацию в Windows ключам для безопасного доступа к удаленным компьютерам/серверам. Рассмотрим, как сгенерировать пару ключей в Windows (открытый и закрытый ключи) и настроить встроенные SSH сервер в Windows 10/11 и Windows Server 2025/2022/2019 для аутентификации по SSH ключам (без ввода паролей).

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

Генерация SSH ключей на клиенте Windows

Сначала вам нужно сгенерировать пару ключей (открытый и закрытый) на клиентском компьютере (с которого вы будете подключаться к удаленному Windows по SSH). Закрытый ключ хранится на клиенте (не нужно передавать его никому!), а открытый ключ нужно скопировать в файл authorized_keys на SSH сервере.

Чтобы сгенерировать SSH ключи на клиенте Windows, вы должны установить клиент OpenSSH. В современных версиях Windows (начиная с Windows 10 1709) и Windows Server встроенный клиент OpenSSH можно установить как отдельный компонент с помощью PowerShell:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

В более старых версиях Windows можно придется вручную установить порт Win32-OpenSSH с GitHub (см. пример в статье о настройке SFTP сервера в Windows).

Запустите обычную (непривилегированную сессию PowerShell) и сгенерируйте пару ED25519 ключей:

ssh-keygen -t ed25519

В настоящее время ключи, сгенерированные криптографическим алгоритмом Ed25519 являются рекомендованным стандартом для SSH-аутентификации (современный, быстрый и безопасный алгоритм) Ранее распространенный тип ключей RSA (включая RSA 2048) RS сейчас не рекомендуется к использованию (только для доступа к старому оборудованию).

Утилита попросит вас указать пароль для защиты закрытого ключа (passphrase). Если вы укажете пароль, то каждый раз при использовании этого ключа для SSH авторизации, вы должны будете вводить этот пароль. Я не стал указывать пароль для ключа (не рекомендуется).

windows ssh-keygen генерация пары ssh ключей

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\myuser/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\myuser/.ssh/id_ed25519.
Your public key has been saved in C:\Users\myuser/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:C2wXeCQSUcJyq0 myuser@computername
The key's randomart image is:
+--[ED25519 256]--+
|  ..*O=..o.      |
+----[SHA256]-----+

Утилита ssh-keygen по умолчанию сохраняет сгенерированную пару ключей в профиле текущего пользователя Windows, в котором создается каталог .ssh ( %USERPROFILE%\.ssh ). Ключи представляют собой два файла:

ls $env:USERPROFILE\.ssh

файлы ключей в папке ssh

  • id_ed25519 – закрытый ключ, который должен оставаться на клиенте и не копироваться никуда (если вы сгенерировали ключ типа RSA, файл будет называться id_rsa )
  • id_ed25519.pub – публичный (открытый) ключ, этот ключ нужно будет скопировать на удаленный хост, к которому вы будете подключаться по SSH (аналогичный RSA ключ называется id_rsa.pub )

открытый и закрытый ssh ключи в windows

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

SSH Agent может хранить закрытые ключи и предоставлять их в контексте безопасности текущего пользователя. Запустите службу ssh-agent и настройте автоматический запуск с помощью PowerShell команд управления службами:

Set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent

Добавьте ваш закрытый ключ в базу ssh-agent:

ssh-add "C:\Users\user\.ssh\id_ed25519"

Identity added: C:\Users\kbuldogov\.ssh\id_ed25519 (kbuldogov@computername)

добавить ключ в ssh агент windows
Или так:

ssh-add.exe $ENV:UserProfile\.ssh\id_ed25519

Настройка OpenSSH в Windows для аутентификации по SSH ключам

После того, как вы сгенерировали ключи на клиенте, можно перейти к настройке SSH сервера. В нашем примере это обычный компьютер с Windows 11 и настроенной службой OpenSSH.

Проверяем что служба OpenSSH сервера установлена и запущена:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Ser*'

Get-Service sshd

Проверить что сервер openssh установлен в windows

Настройки сервера OpenSSH в Windows хранятся в текстовом конфигурационном файле C:\ProgramData\ssh\sshd_config . По умолчанию в файле sshd_config не включена аутентификация по ключам. Проверьте список разрешенных способов аутентификации в OpenSSH с помощью такой PowerShell команды (Select-String используется как аналог grep в PowerShell):

cat "C:\ProgramData\ssh\sshd_config"| Select-String "Authentication"

#PubkeyAuthentication yes
#HostbasedAuthentication no
# HostbasedAuthentication
PasswordAuthentication yes
#GSSAPIAuthentication no

включить ssh аутентфикацию по ключам в windows

В этом примере строка PubkeyAuthentication закомментирована, значит этот способ аутентификации отключен.

Откройте файл sshd_config с помощью блокнота, раскоментируйте строку:

Notepad C:\ProgramData\ssh\sshd_config

PubkeyAuthentication yes

параметр PubkeyAuthentication yes в файле sshd_config

После внесения любых изменений в конфигурационный файл sshd_config службу нужно перезапускать:

Restart-service sshd

Дополнительно в файле sshd_config вы можете запретить SSH подключение по паролю по паролю. Настройте в конфигурации такую опцию:

PasswordAuthentication no 

Можно включить эту опцию командой:

(Get-Content C:\ProgramData\ssh\sshd_config).Replace("#PasswordAuthentication yes","PasswordAuthentication no") | Set-Content C:\ProgramData\ssh\sshd_config

Вход по SSH ключу для администраторов и пользователей Windows

Далее нужно скопировать значение из файла открытого ключа (id_ed25519.pub) с клиента на сервер. Куда копировать значение ключа зависит от того, входит ли пользователь, под которым вы будете подключаться в группу локальных администраторов (Administrators) или нет.

  • Для обычных пользователей (не администраторов), ключи добавляются в файл authorized_keys в профиле пользователя. Это поведение задается вот этим параметром в конфиг файле: Get-Content C:\ProgramData\ssh\sshd_config | Select-String -Pattern "^AuthorizedKeysFile"
     AuthorizedKeysFile      .ssh/authorized_keysAuthorizedKeysFile для обычного пользователя
  • Для локальных администраторов, ключи нужно добавлять в файл C:\ProgramData\ssh\ administrators_authorized_keys . Это также задано в конфиге: Get-Content C:\ProgramData\ssh\sshd_config -Tail 2  Match Group administrators 
     AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keysAuthorizedKeysFile файл с ssh ключами для админов

Предположим, нам нужно настроить SSH доступ под непривилегированным пользователем user1.

Скопируйте файл id_ed25519.pub на SSH сервер в каталог .ssh профиля пользователя, под которым вы будете подключаться к SSH серверу. Например, у меня в Windows 11 создан пользователь user1, значит я должен скопировать ключ в файл C:\Users\user1\.ssh\authorized_keys.

В файле authorized_keys при необходимости можно добавить несколько SSH ключей, каждый с новой строки.

В данном примере подразумевается, что user1 это обычная учетная запись пользователя без прав локального администратора на Windows компьютере с сервером SSH.

Если каталог .ssh в профиле отсутствует, его нужно создать вручную.

файл с открытым ключом на сервере ssh authorized_keys

Можно скопировать ключ на SSH сервер с клиента с помощью SCP:

scp C:\Users\youruser\.ssh\id_rsa.pub admin@192.168.1.90:c:\users\user1\.ssh\authorized_keys

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

Get-Content C:\Users\sysops\.ssh\id_ed25519.pub|Set-Clipboard

Вставьте полученное значение ключа в следующий PowerShell скрипт и выполните его на сервере SSH. Это добавит открытый ключ в профиль пользователя:

New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.ssh"

Add-Content -Force -Path "$env:USERPROFILE\.ssh\authorized_keys" -Value 'ssh-ed25519 AAAAxxxxxxxxxx sysops@home-S6G9U9C'

Добавить открытый ssh ключ в файл authorized_keys

Если пользователь, под которым вы хотите подключиться к Windows хосту по SSH входит в локальную группу Administrators (SID группы S-1-5-32-544 ):

В OpenSSH используются особые настройки доступа по ключам для пользователей с правами локального администратора Windows. По умолчанию открытые ключи таких пользователей считываются из единого файла C:\ProgramData\ssh\administrators_authorized_keys (вместо файла authorized_keys в профиле пользователя).

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

Откройте файл C:\ProgramData\ssh\administrators_authorized_keys и скопируйте в него строку с открытым ssh-ed25519 ключом с клиента.

administrators_authorized_keys ключи для админов

Один файл authorized_keys может содержать несколько открытых ключей.

В старых версиях OpenSSH для корректного подключения под администратором приходилось отключать режим StrictModes в конфигурационном файле sshd_config. По умолчанию этот режим включен и запрещает аутентификацию по ключам, если закрытый и открытый ключ недостаточно защищены. Раскомментируйте строку #StrictModes yes , измените на StrictModes no .

sshd_config отключить StrictModes

В целях безопасности права на конфигурационный файл sshd_config должны быть только у группы Administrators и SYSTEM). Вы можете изменить NTFS права на файл с помощью:

настройка ntfs прав доступа к файлу administrators_authorized_keys для ssh доступа по ключам в windows

После этого SSH аутентификация по ключам работает даже при отключенном режиме StrictModes

Чтобы использовать ключ authorized_keys из профиля пользователя, и не переносить данные открытого ключа в файл administrators_authorized_keys, вы можете закомментировать строку в файле конфигурации OpenSSH (C:\ProgramData\ssh\sshd_config).

Закомментируйте строки:

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Match Group administrators AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

 После сохранения изменений в файле sshd_config не забудьте перезапустить службу sshd.

restart-service sshd

Подключаемся к SSH серверу по ключу из Windows

Теперь вы можете подключиться к SSH серверу без ввода пароля пользователя.

Для подключения через SSH к удаленному хосту используется следующая команда:

ssh (username)@(имя или IP адрес SSH сервера)

Например,

ssh user1@192.168.1.90

Это означает, что вы хотите подключиться к удаленному SSH серверу с адресом 192.168.1.90 под учетной записью user1 . Служба SSH Agent автоматически попытается использовать для авторизации сохраненный ранее закрытый ключ. А если вы не задали пароль (passphrase) защиты для закрытого ключа, вы сразу автоматически подключитесь к вашему удаленному серверу Windows.

первое подключение к windows по ssh добавить отпечаток ключа

При первом подключении нужно добавить отпечаток ключа SSH сервера в доверенные. Наберите yes -> Enter.

The authenticity of host '192.168.1.90 (192.168.1.90)' can't be established.
ECDSA key fingerprint is SHA256:LNMJTbTS0EmrsGYTHB3Aa3Tisp+7fvHwZHbTA900ofw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Дополнительные полезные опции SSH клиента:

  • -v – отображать детальный лог SSH подключения
  • -i – вручную указать путь к файлу закрытого ключа: ssh user1@192.168.14.145 -i "C:\Users\user\.ssh\id_ed25519"
  • для подключения с помощью учетной записи пользователя из домена Active Directory используется формат: ssh kbuldogov@winitpro.ru@192.168.1.90 или ssh winitpro\adm1@ws025
Аутентификация по ключам в OpenSSH поддерживается для локальных пользвоателей и пользователей домена AD. Для аккаунтов EntraID и MSA ssh-аутентификация не поддерживается.

Информацию по логам аутентификации в Windows с помощью SSH ключей можно найти в журнале события. В современных версиях OpenSSH логи пишутся не в текстовые файлы, а в отдельный журнал Event Viewer (Application and services logs -> OpenSSH -> Operational).

При успешном SSH подключении с помощью ключа в журнале появится событие:

EventID 4
sshd: Accepted publickey for locadm from 192.168.14.1 port 55772 ssh2: ED25519 SHA256:FEHDWM/J74FbIzCCoJNbh14phS67kQgh7k8UrKPSvCM

событие ssh аутентфикации по ключу в event viewer windows 11

Если вы установили PasswordAuthentication no, и некорректно настроите аутентификацию по ключам, то при подключении по ssh будет появляться ошибка:

user1@192.168.14.145: Permission denied (publickey,keyboard-interactive).

ошибка ssh аутентфикации в windows по ключу Permission denied publickey keyboard interactive

В OpenSSH на Linux доступна опция PermitRootLogin, позволяющая ограничить доступ к SSH серверу под аккаунтом root. В Windows OpenSSH эта директива не доступна и для ограничения доступа администраторов нужно использовать параметр DenyGroups.

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


Предыдущая статья Следующая статья


Комментариев: 26 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)