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

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

У меня это работает на моем локальном рабочем столе, и я могу использовать ssh с ключом с машин Unix или других машин OpenSSH для Windows.

Я реплицировал сборку на сервер, я могу нормально работать с аутентификацией по паролю, но когда я использую ключи, возникает следующая проблема:

debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug3: start over, passed a different list publickey,password,keyboard-interactive
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /cygdrive/c/sshusers/jsadmint2232/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
Connection closed by 127.0.0.1

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

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

Вот шаги, которые я предпринял:

  1. Установите OpenSSH для Windows
  2. mkgroup -l >>..\etc\group (добавлены локальные группы)
  3. mkgroup -d >>..\etc\group (добавлены доменные группы)
  4. mkpasswd -L -u openssh >>..\passwd (добавлен мой локальный пользователь)
  5. mkpasswd -D -u jsadmint2232 >>..\passwd (добавлен пользователь моего домена)
  6. Отредактировал домашний адрес в файле passwd, чтобы он указывал на c: \ sshusers% USER%, где% USER% - имя пользователя.
  7. Включена аутентификация по паролю, отключена аутентификация по ключу
  8. Создал ключи SSH для jsadmint2232 / OpenSSH и обеспечил создание файлов в домашних каталогах.
  9. Добавлены файлы authorized_keys в каталоги .ssh для каждого пользователя и добавлены ключи для входящих подключающихся пользователей
  10. net stop opensshd / net start opensshd
  11. Проверьте, работает ли аутентификация по паролю как локально, так и удаленно
  12. Обновлен sshd_config, чтобы включить аутентификацию ключа - перезапустите opensshd
  13. Проверить соединение и получить ошибку выше. Кроме того, он даже не пытается выполнить аутентификацию по паролю.
  14. Обновлен sshd_config, чтобы полностью отключить аутентификацию по паролю - перезапустите opensshd
  15. Проверить соединение и по-прежнему получать ошибку выше

Похоже, что сервер по какой-то причине убивает соединение.


person Cambolie    schedule 25.04.2013    source источник


Ответы (9)


Ниже приведены шаги по настройке OpenSSH, поставляемого с Windows 10 v.1803 (обновление за апрель 2018 г. См. Комментарии к этому сообщению, он может не работать с 1809).

Настройка сервера (PowerShell с повышенными привилегиями):

  1. Установите сервер OpenSSH: Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0.

  2. Запустите агент и службы sshd: Start-Service ssh-agent; Start-Service sshd (это автоматически сгенерирует ключи хоста и конфигурацию по умолчанию в $env:ProgramData\ssh).

  3. [Необязательно] Установите модуль PowerShell OpenSSHUtils: Install-Module -Force OpenSSHUtils

Настройка клиента (PowerShell без повышенных прав):

  1. Сгенерируйте ключ пользователя: cd $env:USERPROFILE\.ssh; ssh-keygen.exe, следуйте инструкциям, согласитесь с предложенным по умолчанию расположением файла. Это создаст 2 файла: id_rsa и id_rsa.pub;

  2. [Необязательно] добавьте ключ к агенту аутентификации, чтобы вам не приходилось вводить пароль каждый раз, когда вы его используете: ssh-add .\id_rsa (или любой другой файл);

Продолжение настройки сервера (PowerShell без повышенных прав):

  1. Авторизуйтесь как пользователь, для которого будет использоваться авторизация открытого ключа
  2. cd $env:USERPROFILE; mkdir .ssh; cd .ssh; New-Item authorized_keys;
  3. Вставьте содержимое файла id_rsa.pub из клиента в файл .ssh\authorized_keys из предыдущего шага.
  4. Setup permissions properly (important!!!):
    1. Run start . to open explorer with the current folder ($env:USERPROFILE\.ssh);
    2. Щелкните правой кнопкой мыши authorized_keys, перейдите к Properties -> Security -> Advanced
    3. Нажмите «Отключить наследование»;
    4. При появлении запроса выберите «Преобразовать унаследованные разрешения в явные разрешения для этого объекта»;
    5. (действительно, очень важно) Удалите все разрешения для файла, кроме SYSTEM и себя. В файле должно быть ровно две записи о разрешениях. Некоторые руководства предлагают запустить Repair-AuthorizedKeyPermission $env:USERPROFILE\.ssh\authorized_keys - это попытается добавить пользователя sshd в список разрешений, и это нарушит аутентификацию, поэтому не делайте этого или, по крайней мере, не соглашайтесь на добавление sshd пользователь). И SYSTEM, и вы должны иметь полный контроль над файлом.
  5. Если ваша сборка Windows - 1809 или более поздняя, ​​необходимо закомментировать следующие строки в C:\ProgramData\ssh\sshd_config файле. Затем перезапустите службу sshd.
    # Match Group administrators                                                    
    #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys  
    

Клиент:

  1. Запустите ssh <serverusername>@<serverhostname>. На этом этапе он должен работать.

Пробовал это с Windows 10 в качестве сервера и как с самим собой, так и с Debian Linux в качестве клиента.

person n0rd    schedule 24.05.2018
comment
Ты мой герой @ n0rd ... Я часами боролся за правильную настройку разрешений, но похоже, что Repair-AuthorizedKeyPermission установил пользователя sshd, что сломало его! (Я думал, что он должен быть там, чтобы процесс SSH-сервера OpenSSH мог его просмотреть). большое спасибо! - person gabn88; 15.07.2018
comment
Спасибо! Давно занимаюсь этим вопросом, пока не прочитал ваш ответ! - person rhcpfan; 04.09.2018
comment
У меня не работает. Я точно выполнил инструкции по настройке сервера. Итак, у меня есть этот файл authorized_keys, где в списке разрешений есть только системный пользователь и я, но SSHing к серверу Windows не работает с ключом SSH. Только с паролем. Он отлично работает с сервером Linux в качестве цели с тем же файлом authorized_keys. - person kayahr; 07.10.2018
comment
Продолжение моего последнего комментария: я пробовал его на другом компьютере с Windows (1803 г.). Он там работает. Не работает на Windows 10 1809. Microsoft что-то напортачила? Или для этой версии Windows требуются дополнительные изменения конфигурации? - person kayahr; 07.10.2018
comment
Еще одно продолжение и решение моей проблемы: в Windows 10 1809 есть новая специальная запись конфигурации в C:\ProgramData\ssh\sshd_config, которая определяет, что для пользователей-администраторов ключи считываются из __PROGRAMDATA__/ssh/administrators_authorized_keys. Опять же, для этого файла нужны особые разрешения. Доступ к нему должен иметь только системный пользователь и группа администраторов. - person kayahr; 07.10.2018
comment
Не стесняйтесь отправлять это в качестве ответа, у меня еще нет 1809, поэтому я не могу проверить. - person n0rd; 09.10.2018
comment
В 1809 году я могу подтвердить, что представленное решение @kayahr было тем, что мне пришлось сделать для аутентификации с помощью открытого ключа, поскольку мой пользователь является администратором. Спасибо @kayahr! - person pwbred; 25.11.2018
comment
Примечание: файл ssh_config отсутствовал в моей системе, но мне нужно было указать ssh.exe для поиска еще одного ключа RSA, помимо того, который находится в файле id_rsa. Итак, я создал ssh_config файл с нуля в c:\ProgramData\ssh с помощью команды wsl vim ssh_config, запущенной из командной строки администратора / с повышенными привилегиями. Я вставил содержимое ssh_config по умолчанию, присутствовавшего в моей установке WSL, и добавил IdentityFile ~/.ssh/id_rsa_2, чтобы указать ssh клиенту также искать второй ключ. Это сработало. Версия для Windows: 10.0.17763.348. - person shub; 09.03.2019
comment
Для некоторых PowerShell, чтобы избежать необходимости комментировать часть match group administrators, см. github.com/jen20/packer-aws-windows-ssh/blob/master/files/ (через operator-error.com/2018/04/16/windows-amis-with-even) Спасибо @ jen20! - person Peter Mounce; 12.06.2019
comment
Это было огромной помощью, но разрешения все еще оставались проблемой. Эти 3 команды исправили это: icacls C:\ProgramData\ssh\administrators_authorized_keys /remove "NT AUTHORITY\Authenticated Users" и icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r и get-acl C:\ProgramData\ssh\ssh_host_dsa_key | set-acl C:\ProgramData\ssh\administrators_authorized_keys источник - person bitinerant; 28.06.2019
comment
Спасибо ! Чтобы иметь возможность использовать аутентификацию с ключом без пароля с файлом authorized_keys в user / .ssh, мне нужно было закомментировать строки # Match Group administrators # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys и перезапустить службу OpenSSH SSH Server. - person trogne; 09.09.2019
comment
В моем sshd_config файле не было упомянутых вами строк, но я заметил, что в разделе Аутентификация строка PubkeyAuthentication yes была закомментирована. Раскомментирование и перезапуск сервисов у меня сработали! Надеюсь, это поможет - person Efi Kaltirimidou; 05.10.2019
comment
То, что я пропустил в первый раз, - помимо разрешений на файл authorized_keys, владельцем файла открытого ключа должен быть также пользователь, в домашней папке которого он находится. - person Patrick Stephansen; 21.10.2019
comment
Сервер Step 4 - великолепно! Хотел бы я проголосовать за это больше одного раза. - person user590028; 10.12.2019
comment
отлично, у меня это сработало с Windows Server 2019 v.1809 - person xCovelus; 15.01.2020
comment
Я могу проверить, что этот метод все еще работает на v.2004 (версия для инсайдеров) - person R. Zhu; 16.01.2020
comment
Комментируя, как в пункте 5, я решил эту проблему в Windows 10 Enterprise, сборка 18383. Спасатель жизни, спасибо! - person Karlsson; 27.04.2020
comment
Основные идеи здесь работали для меня в Windows 10 Pro 2004, но изменение разрешений для id_rsa было не обязательным. Важные части конфигурации SSH, которые необходимо было сделать, - это раскомментировать строку PubkeyAuthentication yes и закомментировать раздел Match Group administrators. (При желании раскомментируйте и установите PasswordAuthentication no, если вы не хотите разрешать доступ по паролю) - person Herohtar; 09.09.2020
comment
Горел целый день, пока не наткнулся на твой пост. Работал также для 1809. Эта проблема с разрешением ... почему журналы ничего не говорят ?? проклятие.. - person Elior Malul; 02.10.2020
comment
@EliorMalul, я понял это из логов. Проблема в том, что по умолчанию sshd не регистрирует много данных, вам нужно повысить уровень детализации до 11 (LogLevel DEBUG3 в sshd_config), чтобы получить от него что-то полезное. - person n0rd; 02.10.2020
comment
Возможно обновление в v1909, у меня должна была быть СИСТЕМА, АДМИНИСТРАТОРЫ и мой пользователь в списке доступа. - person joshhemphill; 27.11.2020
comment
Я не знаю, почему это не принятый ответ! Я искал часы, и ваш ответ - единственный, который сработал !!! Большое спасибо!!! - person babaliaris; 04.01.2021
comment
Что касается файла, в котором должно быть ровно две записи о разрешениях, я заметил, что дополнительные разрешения для группы администраторов не вызывают проблем. - person ndemou; 26.01.2021
comment
Самым простым лайнером для решения проблемы неправильной настройки authorized_keys является icacls.exe "$($env:USERPROFILE)/.ssh/authorized_keys" /inheritance:r /grant "$($env:USERNAME):F" /grant "NT AUTHORITY\SYSTEM:F". Это единственное, что останавливает OpenSSH из коробки для меня, никаких других изменений разрешений не требуется; похоже, это также повторяет предполагаемое поведение Repair-AuthorizedKeyPermission, но без нескольких сотен строк Powershell. - person Diablo-D3; 14.02.2021
comment
@Herohtar #PubkeyAuthentication yes раскомментирование не имеет значения, так что вы можете оставить комментарий. В Linux нужно раскомментировать. - person Timo; 22.06.2021
comment
@Timo Если это не имело значения, возможно, вы редактировали не тот файл. sshd не будет использовать аутентификацию с открытым ключом, если вы не укажете ему эту настройку, независимо от того, Windows это или Linux. - person Herohtar; 23.06.2021
comment
Проработал несколько месяцев. Но затем мне пришлось повторить шаг 4, так как ключ auth внезапно перестал работать. Разрешения для администраторов и моего пользователя-администратора (мой пользователь не является администратором) каким-то образом снова появились для файла authorized_keys .. - person Adam; 20.07.2021

Используйте эту последовательность команд в PowerShell, чтобы исправить разрешение administrators_authorized_keys

$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys
$acl.SetAccessRuleProtection($true, $false)
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")
$acl.SetAccessRule($administratorsRule)
$acl.SetAccessRule($systemRule)
$acl | Set-Acl

Только группа «СИСТЕМА» и «Администраторы» должна иметь права доступа к файлу без наследования.

Набор разрешений admin_authorized_keys

person Sergio Cabral    schedule 17.11.2020

Еще один совет, если вы застряли, - запустить sshd в режиме отладки. Я сделал это:

  1. Остановите службу sshd
  2. Откройте консоль PowerShell с правами администратора
  3. Введите sshd -d.
  4. Введите логин с моего клиентского компьютера.

Оказывается, ключ должен быть, например, в C: \ ProgramData \ ssh \ administrators_authorized_keys вместо C: \ Users \ yourUsser.ssh \ authorized_keys.

person gWay    schedule 11.07.2020
comment
Очень полезный для меня ответ. Это помогает не только ответить на вопрос, в чем проблема, но и как решить подобные проблемы в следующий раз. - person Arty; 30.09.2020

Я решил проблему ...

Это связано с учетной записью, запустившей службу - она ​​использовала учетную запись Local System - это не давало ей доступа к открытому ключу и файлу authorized_keys.

Как только я остановил службу и запустил ее как пользователь, к которому я пытался подключиться, все заработало!

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

person Cambolie    schedule 25.04.2013
comment
Что вы имеете в виду, вы остановили службу и запустили ее как пользователь, к которому я пытался подключиться? Я не думаю, что вы имеете в виду, что я использую свою фактическую учетную запись пользователя домена. Тогда вы предлагаете мне начать с учетной записи службы, но с какой? - person ShieldOfSalvation; 15.03.2019
comment
Я бы рекомендовал прочитать ответ @ n0rd ниже, прежде чем вообще изучать этот ответ. - person Michael; 28.05.2020

Если вы используете версию OpenSSH от mls-software.com, вот еще одно примечание.

Если вы устанавливаете с использованием учетной записи SSHD_SERVER и разделения привилегий, вы сможете использовать аутентификацию с открытым ключом (согласно http://www.mls-software.com/opensshd-pki.html). Однако, если UAC включен, установка не удастся. Пользователь (ы) не будут созданы должным образом, и служба не будет создана. Пытаться вручную поднять эти предметы постфактум очень сложно. Простое отключение UAC перед установкой позволит процессу установки правильно создать пользователя (ей) и службу. После установки вы можете снова включить UAC.

Когда я создал учетную запись SSHD_SERVER, аутентификация вручную прошла успешно при использовании аутентификации по паролю, но клиент разорвал соединение с помощью «/ bin / bash: Operation not allowed». Аутентификация с открытыми ключами была закрыта сервером (исходная ошибка была отправлена ​​Камболи).

person Dustin    schedule 04.11.2014
comment
Отзывы от mls-software указывают на то, что это не всегда так. Отключение UAC в моем случае помогло решить эту проблему, но не во всех случаях это необходимо. Я изучу свою ситуацию подробнее и посмотрю, смогу ли я опубликовать более подробную информацию. - person Dustin; 05.11.2014
comment
Почему это важно для MLS OpenSSH? Почему он не может работать как локальная система (или какая-то другая, даже доменная, учетная запись?) - person Mikhail Orlov; 12.06.2015

Это просто моя написанная мной версия отличного ответа @ n0rds.

Поместите этот скрипт в каталог с вашим личным / открытым ключом / парой и запустите!

PowerShell.exe -ExecutionPolicy Bypass -File "C:\bypass\prompt\standard.ps1" 2>&1>$null

Add-WindowsCapability -Online -Name OpenSSH.Server
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH SSH Server' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 -Program "%WINDIR%\System32\OpenSSH\sshd.exe"

#Must Enable ssh-agent before starting
Set-Service -Name ssh-agent -StartupType Automatic
Set-Service -Name sshd -StartupType Automatic
Start-Service ssh-agent; Start-Service sshd

$sshdir="$env:USERPROFILE\.ssh"
mkdir $sshdir
copy .\id_rsa $sshdir\
cat  $sshdir\id_rsa
copy .\*.pub  $sshdir\authorized_keys
cat $sshdir\authorized_keys
ssh-add $sshdir\id_rsa

$sshd_config="C:\ProgramData\ssh\sshd_config" 
(Get-Content $sshd_config) -replace '#PubkeyAuthentication', 'PubkeyAuthentication' | Out-File -encoding ASCII $sshd_config
(Get-Content $sshd_config) -replace 'AuthorizedKeysFile __PROGRAMDATA__', '#AuthorizedKeysFile __PROGRAMDATA__' | Out-File -encoding ASCII $sshd_config
(Get-Content $sshd_config) -replace 'Match Group administrators', '#Match Group administrators' | Out-File -encoding ASCII $sshd_config
cat C:\ProgramData\ssh\sshd_config

Restart-Service ssh-agent; Restart-Service sshd

Write-Host "Use this to Login/test Now"
write-host ssh $env:UserName@localhost
person FreeSoftwareServers    schedule 31.10.2020

Я решил это:

  1. Установка в режиме разделения привилегий SSHD_SERVER +. Я также вручную установил разделение привилегий на «да». У меня это не работало долгое время, пользователь не создавался. Потом это сработало, не знаю почему. Я только зашел в учетные записи пользователей в панели управления, чтобы проверить, что UAC выключен. Еще у меня был / var / empty с полным доступом для всех.
  2. Для C: \ openssh \ var \ empty я установил разрешения "получение / установка атрибутов" для всех и для себя и "полные" разрешения для. \ Sshd_server. Я тоже сделал его владельцем.
person Mikhail Orlov    schedule 12.06.2015

Я тщательно протестировал решение n0rd на нескольких компьютерах с Windows Pro 1809 и 2004. Я согласен с большинством его шагов.

Настройка сервера (PowerShell с повышенными привилегиями): согласны со всеми.

Настройка клиента (PowerShell без повышенных прав): согласны со всеми.

Продолжение настройки сервера (PowerShell без повышенных прав): шаги 1,2,3: согласен

Продолжение установки сервера (PowerShell без повышенных привилегий): Шаг 4: НЕ выполняйте никаких действий на шаге 4.

Продолжение настройки сервера (PowerShell без повышенных прав): Шаг 5: Согласитесь

Продолжение настройки сервера (PowerShell без повышенных прав): Шаг 6: (добавлено) Раскомментируйте (удалите #) из C: \ ProgramData \ ssh \ sshd_config: #PasswordAuthentication yes

Продолжение настройки сервера (PowerShell без повышенных прав): Шаг 7: (добавлено) В службах перезапустите SSH-сервер OpenSSH.

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

person BSalita    schedule 17.04.2020

Это стандартное использование Microsoft, ориентированное на английский язык. Строки группового совпадения в настоящее время проверяют строку версии АНГЛИЙСКОГО языка группы администраторов, называемой «администраторы», это НЕ ИСПОЛЬЗУЕТСЯ при установке Windows на многих других языках. В немецкой установке эта строка должна быть «administratoren». Вместо этого они позволяют сопоставить группу по SID. (Это еще более важно в функции сопоставления DenyGroups - еще не тестировал это - но если они проверяют там строки вместо SID, тогда отказы бессмысленны и легко обойдутся с помощью установки на другом языке Windows)

(также см. https://github.com/MicrosoftDocs/windowsserverdocs/issues/1911#issuecomment-771552030)

person TheBigBear    schedule 02.02.2021