101 votes

Configuration d'OpenSSH pour Windows en utilisant l'authentification par clé publique

J'ai des problèmes pour configurer OpenSSH pour Windows, en utilisant l'authentification par clé publique.

Je l'ai fait fonctionner sur mon bureau local et je peux utiliser une clé pour accéder à des machines Unix ou d'autres machines OpenSSH pour Windows.

J'ai répliqué le build sur un serveur, l'authentification par mot de passe fonctionne bien, mais lorsque j'utilise les clés, j'obtiens le problème suivant :

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

Ainsi, pour les besoins du test, j'ai simplement essayé de SSH à localhost, mais même lorsque j'ai essayé à distance, j'ai eu le même problème.

Ce qui est encore plus étrange, c'est que lorsque le mot de passe et la clé publique sont tous deux activés dans l'application sshd_config il n'essaiera d'utiliser que les clés, puis le message ci-dessus et n'essaiera même pas d'utiliser le mot de passe.

Voici les mesures que j'ai prises :

  1. Installer OpenSSH pour Windows
  2. mkgroup -l >>..\etc\group (ajout de groupes locaux)
  3. mkgroup -d >>..\etc\group (ajout de groupes de domaines)
  4. mkpasswd -L -u openssh >>..\passwd (ajout de mon utilisateur local)
  5. mkpasswd -D -u jsadmint2232 >>..\passwd (ajout de l'utilisateur de mon domaine)
  6. Modifié le homedir dans le fichier passwd pour pointer vers c : \sshusers %USER% - où %USER% est le nom de l'utilisateur
  7. Activation de l'authentification par mot de passe, désactivation de l'authentification par clé
  8. Création de clés SSH pour jsadmint2232 / OpenSSH et vérification que les fichiers ont été créés dans les répertoires personnels.
  9. Ajout des fichiers authorized_keys dans les répertoires .ssh pour chaque utilisateur et ajout des clés pour les utilisateurs qui se connectent.
  10. net stop opensshd / net start opensshd
  11. Testez si l'authentification par mot de passe fonctionne à la fois localement et à distance.
  12. Mise à jour de sshd_config, pour activer l'authentification par clé - redémarrer opensshd
  13. Tester la connexion et obtenir l'erreur ci-dessus. En outre, il ne tente même pas l'authentification par mot de passe.
  14. Mise à jour de sshd_config, pour désactiver complètement l'authentification par mot de passe - redémarrer opensshd
  15. Test de connexion et toujours l'erreur ci-dessus

Il semble que le serveur coupe la connexion pour une raison quelconque.

291voto

n0rd Points 2889

Voici les étapes de configuration d'OpenSSH livré avec Windows 10 v.1803 (mise à jour d'avril 2018. Voir les commentaires de ce billet, il se peut que cela ne fonctionne pas avec 1809).

Configuration du serveur (powershell élevé) :

  1. Installer le serveur OpenSSH : Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 .

  2. Démarrer les services agent et sshd : Start-Service ssh-agent; Start-Service sshd (ceci générera automatiquement les clés d'hôtes et la configuration par défaut dans le fichier $env:ProgramData\ssh ).

  3. [Facultatif] Installer le module powershell OpenSSHUtils : Install-Module -Force OpenSSHUtils

Configuration du client (powershell non élevé) :

  1. Générer une clé utilisateur : cd $env:USERPROFILE\.ssh; ssh-keygen.exe suivez les instructions et acceptez l'emplacement du fichier proposé par défaut. Cela va créer 2 fichiers : id_rsa y id_rsa.pub ;

  2. [Facultatif] ajouter une clé à l'agent d'authentification, afin que vous n'ayez pas à saisir de mot de passe à chaque fois que vous l'utilisez : ssh-add .\id_rsa (ou le fichier qui a été généré) ;

La configuration du serveur continue (powershell non élevé) :

  1. Se connecter en tant qu'utilisateur, pour lequel l'authentification par clé publique doit être utilisée.
  2. cd $env:USERPROFILE; mkdir .ssh; cd .ssh; New-Item authorized_keys ;
  3. Collez le contenu du fichier id_rsa.pub du client vers le .ssh\authorized_keys de l'étape précédente.
  4. Configurez correctement les autorisations (important !!!):
    1. Exécuter start . pour ouvrir l'explorateur avec le dossier actuel ( $env:USERPROFILE\.ssh ) ;
    2. Clic droit authorized_keys Allez sur Properties -> Security -> Advanced
    3. Cliquez sur "Désactiver l'héritage" ;
    4. Choisissez "Convertir les permissions héritées en permissions explicites sur cet objet" lorsque vous y êtes invité ;
    5. (vraiment, vraiment important) Supprimez toutes les permissions sur le fichier, à l'exception de l'option SYSTEM y vous-même . Il doit y avoir exactement deux les entrées de permission sur le fichier. Certains guides suggèrent d'exécuter la commande Repair-AuthorizedKeyPermission $env:USERPROFILE\.ssh\authorized_keys - ceci essaiera d'ajouter le sshd à la liste des autorisations et il se briser l'authentification, donc, ne faites pas cela, ou du moins ne vous mettez pas d'accord sur l'ajout du sshd utilisateur). Les deux sites SYSTEM et vous devriez avoir un contrôle total sur le fichier.
  5. Si votre version de Windows est 1809 ou ultérieure, il est nécessaire de commenter les lignes suivantes dans le fichier C:\ProgramData\ssh\sshd_config fichier. Ensuite, redémarrez le sshd service.

    # Match Group administrators                                                    
    #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys  

Client :

  1. Exécuter ssh <serverusername>@<serverhostname> . Cela devrait fonctionner à ce stade.

J'ai essayé avec Windows 10 comme serveur et avec lui-même et un Linux Debian comme client.

12voto

user524607 Points 91

Un autre conseil, si vous êtes bloqué, est d'exécuter sshd en mode débogage. C'est ce que j'ai fait :

  1. Arrêtez le sshd service
  2. Ouvrez une console PowerShell avec des privilèges d'administrateur.
  3. Tapez 'sshd -d'.
  4. Type connexion depuis ma machine cliente

Il s'avère que la clé doit être dans e.g. C:\ProgramData\ssh\administrators_authorized_keys au lieu de C:\Users\yourUsser.ssh\authorized_keys .

7voto

Sean Points 1

J'ai résolu le problème...

Il est lié au compte qui a démarré le service - il utilisait l'icône Système local ce qui l'empêchait d'accéder à la clé publique et au fichier authorized_keys.

Une fois que j'ai arrêté le service et démarré en tant qu'utilisateur auquel j'essayais de me connecter, cela a fonctionné !

En gros, vous devez commencer par un compte de service, puis les utilisateurs externes se connectent en tant que cet utilisateur.

4voto

C'est juste ma version scriptée de @n0rds grande réponse .

Placez ce script dans un répertoire avec votre paire de clés privée/publique et exécutez !

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

3voto

Dustin Points 81

Si vous utilisez la version d'OpenSSH de mls-software.com, voici une autre remarque.

Si vous effectuez l'installation en utilisant le compte SSHD_SERVER et la séparation des privilèges, vous pourrez utiliser l'authentification par clé publique (par http://www.mls-software.com/opensshd-pki.html ). Cependant, si l'UAC est activé, vous ne réussirez pas l'installation. Le ou les utilisateurs ne seront pas créés correctement et le service ne sera pas créé. Il est très difficile d'essayer manuellement d'installer ces éléments après coup. La simple désactivation de l'UAC avant l'installation permettra au processus d'installation de créer correctement le(s) utilisateur(s) et le service. Après l'installation, vous pouvez réactiver l'UAC.

Lorsque j'ai créé le compte SSHD_SERVER manuellement, l'authentification a réussi en utilisant l'authentification par mot de passe mais le client a terminé la connexion avec "/bin/bash : Operation not permitted". L'authentification avec les clés publiques a été fermée par le serveur (erreur originale postée par Cambolie).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X