Настройка 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 автоматически попытается использовать для авторизации сохраненный ранее закрытый ключ.
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 аутентификации по ключам в Linux
В интернете полно инструкций как настроить SSH аутентификацию по ключам на сервере Linux. Но каждый раз при настройке мне приходится искать их заново, потому что некоторые нюансы я забываю. Поэтому оставлю тут эту инструкцию в первую очередь для себя и добавлю полезную информацию о журналах отпечатков (fingerprint) ключей, которая нигде не встречается.
Итак, чтобы подключится к *Nix хосту через SSH, нужно предоставить серверу пару: логин + пароль, или логин + ключ. Настройка SSH аутентификации по ключам не только повышает уровень защищенности сервера, но и упрощает жизнь администратору за счет более удобного подключения к серверу. Вместо использования пароля, который может быть перехвачен кейлогером или подсмотрен, мы будет использовать ключи RSA. Для обеспечения достаточного уровня безопасности будем использовать длину ключа 2048 бит. Желательно хранить закрытый ключ на зашифрованном разделе (Bitlocker, EFS), тем самым вы защититесь от кражи закрытого файла с ключом.
Создание SSH ключей для Putty
Для подключения к серверам Linux из Windows я предпочитаю использовать старый-добрый клиент PuTTy. В состав пакета поставки putty входит небольшая утилита puttygen, которая может быть использована для генерации RSA и DSA ключей. Скачайте утилиту с официального сайта https://the.earth.li/
sgtatham/putty/latest/x86/puttygen.exe и запустите ее. В окне PuTTy Key Generator нажмите кнопку Generate и произвольно подвигайте мышкой для создания некой рандомной последовательности. Утилита сгенерирует пару ключей: открытый и закрытый.
Нам интересны следующие возможности интерфейса
Key passphrase | Здесь можно указать пароль для защиты закрытого ключа |
Save public key | Кнопка для сохранения открытого ключа в файл, который нужно будет поместить на удаленный сервер |
Save private key | Кнопка для сохранения закрытого ключа Файл с закрытым ключом должен храниться на клиенте (желательно защищённом) и будет использоваться для подключения к удаленному серверу. |
SSH-2 RSA 2048 | Указывается тип ключа и его длина. В нашем примере достаточно будет выбрать SSH-2 RSA. |
Формат файла ключа, который генерирует утилита puttygen напрямую не подходит для openssh, который запушен на моем сервере. Поэтому мне придется скопировать в буфер значение открытого ключа из окна puttygen в буфер обмена (я выделил его на скриншоте выше). Этот код нужно будет поместить в файл на сервере. Но также сохраните открытый и закрытый ключи в 2 файла с помощью соответствующих кнопок.
Настройка SSH на Linux для аутентификации с помощью ключей
В большинстве дистрибутивов Linux уже настроена поддержка аутентфикации с помощью сертификатов. Откройте конфигурационной файл сервера SSH (/etc/ssh/sshd_config) и раскомментируйте или добавьте следующие стройки:
HostKey /etc/ssh/ssh_host_dsa_key
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Перезапустите SSH командой:
Затем создадим файл с ключом на сервере:
/.ssh/authorized_keys
# chmod 0644
В файл authorized_keys нужно вставить ключ, скопированный из окна puttygen и сохранить его.
Затем на стороне клиента откройте Putty и перейдите в раздел Connection -> SSH -> Auth. Нажмите кнопку Browse и укажите путь к закрытому ключу, который вы сохранили ранее (расширение.ppk)
Открытый ключ, который вы сохранили на сервер, может быть использован для аутентификации на множестве серверов. Т.е. для каждого нового сервера не нужно генерировать новую пару ключей.
Теперь можно подключиться к серверу (нет необходимости перезапускать демона sshd).
Укажем только имя пользователя (в нашем случае это root).
Наличие строки « Authenticating with public key «rsa-key-20161208″» говорит о том, что вы успешно аутентифицировались с помощью ключа RSA.
Журнал подключений по SSH с помощью ключей
Как правило, администратор должен знать, когда и какой ключ или сертификат использовался для подключения к серверу. Однако, в большинстве дистрибутивов эта информация в журналах не отображается. Однако, к примеру, в CentOS 7 со стандартными настройками и уровнем журналирования INFO, отпечатки ключей сохраняются в журнал (# cat /var/log/secure).
В том случае, если в вашем журнале нет этой информации, исправить это не сложно. Отредактируйте конфигурационный файл /etc/ssh/sshd_config, изменив уровень журналирования:
И перезапустите sshd:
Попробуйте еще раз подключится к серверу по SSH с помощью ключа и проверьте журнал:
# cat /var/log/secure
May 20 12:23:17 server sshd[8746]: Connection from 192.168.10.15 port 60162
May 20 12:23:19 server sshd[8746]: Found matching RSA key: 5b:7b:2a:14:29:11:bf:3a:8f:bd:24:99:21:34:cd:e6
May 20 12:23:19 server sshd[8746]: Postponed publickey for root from 192.168.10.15 port 60162 ssh2 [preauth]
May 20 12:23:19 server sshd[8746]: Found matching RSA key: 5b:7b:2a:14:29:11:bf:3a:8f:bd:24:99:21:34:cd:e6
May 20 12:23:19 server sshd[8746]: Accepted publickey for root from 192.168.10.15 port 60162 ssh2
May 20 12:23:19 server sshd[8746]: pam_unix(sshd:session): session opened for user root by (uid=0)
Как видите, теперь в журнале отображается отпечаток ключа, позволяющий идентифицировать пользователя.
Источник