Аутентификация по ключу windows

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

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

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

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

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

В Windows 10 1809 и Windows Server 2019 клиент OpenSSH устанавливается как отдельный встроенный компонент:

Add-WindowsCapability -Online -Name OpenSSH.Client

Запустите обычную (непривилегированную сессию PowerShell) и сгенерируйте пару RSA 2048 ключей с помощью команды:

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

Утилита ssh-keygen создаст каталог .ssh в профиле текущего пользователя Windows (C:\Users\your_username) и поместит в него 2 файла:

  • id_rsa – закрытый ключ
  • id_rsa.pub – публичный ключ

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

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

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

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

Настройка OpenSSH в Windows для авторизации по ключам

Теперь открытый ключ, который вы сгенерировали на клиенте, нужно скопировать на ваш SSH сервер (в этом примере это удаленный компьютер с Windows 10 1903 и настроенной службой OpenSSH).

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

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

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

Теперь вы можете подключиться к SSH серверу без ввода пароля пользователя. А если вы не задали пароль (passphrase) для закрытого ключа, вы сразу автоматически подключитесь к вашему удаленному серверу Windows.

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

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

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

Читайте также:  Сообщения для mac os

ssh admin@192.168.1.90 -i «C:\Users\youruser\.ssh\id_rsa»

Если вы не смогли подключиться к вашему SSH серверу по RSA ключу, и у вас все равно запрашивается пароль, скорее всего пользователь, под которым вы подключаетесь, входит в группу локальных администраторов сервера (SID группы S-1-5-32-544). Об этом далее.

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

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

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

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

Дополнительно в файле sshd_config вы можете разрешить вход по RSA ключам:

И запретить доступ по паролю:

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

Еще один небольшой нюанс. В старых версиях OpenSSH нужно было предоставить права службе NT Service\sshd на чтение ключа authorized_keys.

Для этого нужно выполнить одно из следующих действий:

  • Установить модуль OpenSSHUtils: Install-Module -Force OpenSSHUtils -Scope AllUsers . Для изменения прав на файл нужно выполнить команду: Repair-AuthorizedKeyPermission -FilePath C:\Users\admin\.ssh\authorized_keys ;
  • Измените NTFS права на файл с помощью модуля NTFSSecurity или icacls;
  • Либо вы можете в конфигурационном файле sshd_config отключить режим StrictModes. По умолчанию этот режим включен и запрещает аутентификацию по ключам, если закрытый и открытый ключ недостаточно защищены. Раскомментируйте строку #StrictModes yes , измените на StrictModes no .

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

Спасибо! Первая рабочая статья -_ stackoverflow.com уже весь на эту тему перечитал).

debug1: Found key in C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/known_hosts:9
debug2: set_newkeys: mode 1
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey after 134217728 blocks
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_rsa (000002372A7B17D0), agent
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_dsa (0000000000000000)
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_ecdsa (0000000000000000)
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_ed25519 (0000000000000000)
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_xmss (0000000000000000)
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:5U76PQzmZJ7xce9TDvyt1P/sqNCX/GHOZSLk3TR3x1o C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Trying private key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_dsa

Можете подсказать что не так?

Какую команду используете для SSH подключения? Ключ добавлен в ssh-agent?
Попробуйте указать путь к вашему файлу с закрытым ключом вручную:
ssh root@192.168.1.90 -i «C:\Users\user1\.ssh\id_rsa»

При генерации ключа не нашел файлы в профиле пользователя. Они были в «C:\Windows\System32»

Скорее всего вы запускали cmd\powershell.exe в режиме administrator, поэтому путь по-умолчанию был c:\windows\system32

А как это работает, если сервер на Linux, а клиент на Windows?

Да, все аналогично. Только в linux другое место хранения ключей (в зависимости от дистрибутива)

Ну наконец то получилось по ssh ключу подключиться. Мне нужно было настроить SFTP на Windows 10. Имеются 3 компа, на первом Windows 10 с openssh server и запущенным процессом sftp-server.exe, на втором компе клиенте тоже Windows 10 установил openssh client, сгенерировал публичный и приватный ключ, публичный скопировал на первый комп с Windows 10 где установлен openssh server, переименовал его из id_rsa.pub в authorized_keys. Затем на втором компе клиенте нужно установить PuTTY Key Generator и сконвертировать приватный ключ id_rsa в id_rsa.ppk это нужно чтобы подключиться по SFTP через WinSCP или FileZilla client к серверу openssh. Проблема была в том что всё равно просил пароль от учётной записи администратора от первого компа на сервере. После того как прописал «PubkeyAuthentication yes» и «PasswordAuthentication no» затем «StrictModes no» и закомментировал «# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys» стало заходить без пароля. Есть ещё вопрос. Третий комп это ноутбук с Kubuntu, установил FileZilla client, уже имеется каталог по адресу /home/sergei/.ssh/ в этот каталог скопировал файл id_rsa.ppk со второго компа, то есть с Windows 10. При подключении FileZilla client выбираю протокол SFTP всё как положено, указываю файл с приватным ключом /home/sergei/.ssh/id_rsa.ppk и подключаюсь без ввода пароля, всё работает. Но я так понимаю что это неправильно? На Kubuntu тоже надо генерировать ключи приватный и публичный? И где тогда размещать новый публичный ключ на сервере, если на нём уже есть C:\Users\Sergei\.ssh\authorized_keys

Читайте также:  Windows popping up virus

В файле authorized_keys можно указывать несколько ключей. Просто скопируйте значение второго ключа с новой строки и сохраните файл.

SSH — авторизация по ключу из Windows. Putty — беспарольная авторизация

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

Приватный ключ должен всегда храниться исключительно у его владельца. Для большей надежности на приватный ключ можно установить пароль — в этом случае воспользоваться им можно будет только зная парольную фразу. Восстановить пароль возможно исключительно методом перебора (brutforce), но если парольная фраза будет состоять из 12 и более символов, решить такую задачу будет возможно только на достаточно мощном оборудовании за весьма продолжительное время. В случае утери приватного ключа необходимо сгенерировать новый и заменить все публичные ключи.

Основное преимущество ключей в том, что они, в отличие от паролей, не передаются по сети и не могут быть скомпрометированы путем расшифровки трафика. Как это работает весьма доступно рассказано в этом видео: Алгоритм Диффи-Хеллмана .

Putty

Самая распространенная программа для доступа по SSH в Windows — Putty. Официальный сайт, где можно скачать инсталлятор и исходные коды ПО: chiark.greenend.org.uk . Putty распространяется бесплатно.

Для авторизации по ключу понадобится 3 программы, входящие в состав Putty: putty.exe, puttygen.exe и pageant.exe — можно скачать инсталлятор (putty-0.XX-installer.msi), который установит все сразу, либо же скачать каждую утилиту отдельно. Все утилиты желательно хранить в директории(ях), которые не содержат пробелов, например сразу после установки переместить все файлы Putty из C:\Program Files\Putty в C:\Putty — для авторизации по ключам через Putty это не критично, но директории с пробелами могут сыграть злую шутку в будущем, например, при настройке авторизации по ключам в Git.

Создание ключа в Putty — Puttygen

За создание и работу с ключами отвечает утилита puttygen.exe. Запустите её и оставьте значения по умолчанию:

  • «Type of key to generate»: SSH-2 RSA
  • «Number of bits in a generated key»: 2048,

После этого нажмите кнопку «Generate». Теперь необходимо перемещать указатель мыши по экрану, пока не будет сгенерирован ключ — это займет пару десятков секунд. После этого можно задать пароль для приватного ключа (заполнить Key passphrase и повторить пароль в Confirm passphrase), комментарий (будет доступен всем, кто получит доступ к публичному ключу) и сохранить приватный ключ в надежное место, нажав на кнопку «Save private key». Файл ключа RSA 2048 bit будет занимать около 500 байт.

Читайте также:  Сбросить буфер обмена windows

Приватный ключ Putty сохраняется в файл с расширением ppk и будет работать только с Putty. Если необходимо использовать приватный ключ на компьютере с Linux + OpenSSH его необходимо конвертировать в формат OpenSSH воспользовавшись верхним меню утилиты «PuTTY Key Generator»: Conversion -> Export OpenSSH key.

Публичный ключ можно получить в любой момент, загрузив приватный в puttygen.exe (кнопка «Load») и сохранить его нажатием кнопки «Save public key». Стоит только учесть один важный момент: для использования публичного ключа в OpenSSH сохраненный файл не подойдет, так как для OpenSSH необходимо, чтобы публичные ключи в authorized_keys были одной строкой без лишних символов. Получить непрерывный ключ можно скопировав его из поля «Public key for pasting into OpenSSH authorized_keys file» — только будьте внимательны, в этом поле есть полоса прокрутки и скопировать нужно весь публичный ключ.

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

Запускаем Putty и настраиваем подключение. Выбираем «Default Settings» и нажимаем кнопку «Load». В Connection->SSH->Auth указываем путь к приватному ключу в поле «Private key file for authentication». Теперь возвращаемся на вкладку Session нажимаем сохранить, чтобы указанные настройки были записаны по-умолчанию.

После нажатия кнопки Open утилита Putty подключится к серверу, если были правильно указаны Host Name и Port (по умолчанию 22) и на черном экране отобразится приглашения для аутентификации такого вида:

Если на приватный ключ не был установлен пароль, авторизация будет осуществлена сразу после ввода логина и нажатия Enter, иначе появится следующее приглашение:

В ответ на него нужно ввести пароль приватного ключа (он не будет передан на сервер, а служит только для локальной расшифровки ключа) и если все ок, то процедура авторизации будет успешно пройдена.

«MY-Rsa-Key» — это комментарий к публичному ключу. Если вместо этого появится приглашение на ввод обычного пароля пользователя, например: «test@192.168.1.1’s password:», значит проблема, скорее всего, где-то на стороне сервера, который некорректно настроен на авторизацию по ключу для выбранного пользователя. Для того, чтобы Putty произвел авторизацию по ключу необходимо только ввести путь к приватному ключу, как написано выше. Также следует убедиться, что в Connection->SSH->Auth стоит галочка напротив «Attempt authentication using Pageant», которая установлена по умолчанию.

Pageant — хранение приватных ключей в расшифрованном виде

Если ваш ключ используется на более чем одном устройстве или учетной записи, то чтобы не вводить пароль от ключа каждый раз, как вы подключаетесь к серверу, можно воспользоваться утилитой Pageant — Putty Authentication Agent — обеспечит надежную беспарольную аутентификацию. После запуска утилиты нажмите кнопку «Add Key», выберите приватный ключ защищенный паролем и введите от него пароль. Теперь подключение к учетным записям при помощи пароля через Putty не будет требовать ввода пароля от приватного ключа все время, пока этот ключ будет находится в расшифрованном виде в Pageant.

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

В Pageagent следует добавлять только приватные ключи, защищенные паролем. Можно добавить и приватный ключ без пароля, но это действие лишено всякого смысла, так как информацию о том, какой ключ использовать для какого подключения Putty берет из настройки в Connection->SSH->Auth->»Private key file for authentication».

Оцените статью