2 votes

Phpseclib - Puis-je me connecter en utilisant un nom d'utilisateur, une clé et un mot de passe (pas une phrase de passe de clé)

Désolé si j'ai manqué cela dans la documentation, mais est-il possible de se connecter à un serveur SFTP avec une clé privée et un mot de passe (pas une passphrase pour ma clé privée)?

Les exemples montrent les types d'authentification username/password, username/key et username/key/key passphrase.

Lors de la connexion via la ligne de commande, je recevrais cette invitation pour mon mot de passe...

password de user@x.x.x.x :

En espérant que cette bibliothèque puisse gérer cela?

Sinon, y a-t-il d'autres solutions basées sur PHP qui pourraient prendre en charge l'authentification par username/clé et mot de passe serveur? Je suis assez flexible ici et peux installer des modules si nécessaire.

MODIFICATION

Merci pour l'aide jusqu'à présent... J'avais essayé ce que vous avez mentionné Neubert mais cela n'a pas semblé fonctionner. Et pour vérifier ce qui est nécessaire pour se connecter au serveur, j'ai testé cela sur la ligne de commande.
sftp clé user@ip - Invité pour le mot de passe comme prévu
sftp user@ip - Invité pour le mot de passe mais lorsque correctement entré, on m'a dit que je suis "authentifié avec un succès partiel".

Je pense que les autorisations sur les répertoires et les clés devraient être correctes si je peux rentrer en utilisant d'abord la clé puis le mot de passe.

Je commence à penser que cette bibliothèque ne prend pas en charge ce dont j'ai besoin.

3voto

neubert Points 3699

Phpseclib prend en charge l'authentification multi-facteurs. Voici un exemple de comment le faire :

loadKey(file_get_contents('/path/to/key.pem'));

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'pass1', $rsa)) {
    exit('Échec de la connexion');
}
// cela fait la même chose que ci-dessus
//if (!$ssh->login($username, 'pass1') && !$ssh->login('username', $rsa)) {
//    exit('Échec de la connexion');
//}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

Cependant, gardez à l'esprit : beaucoup de gens confondent les clés privées protégées par mot de passe comme étant multi-facteurs (mot de passe et clé publique) alors qu'en réalité ce n'est pas le cas. Du moins pas en ce qui concerne SSH.

2voto

user2048615 Points 21

Clause de non-responsabilité par @MartinPrikryl: Cette solution est obsolète, maintenant que phpseclib prend en charge l'authentification multi-facteurs nativement - Voir également la réponse de @BoukeVersteegh et @neubert.


J'ai rencontré le même problème pour l'un de mes projets utilisant phpseclib. J'ai essayé plusieurs suggestions en vain, et j'ai finalement fait des recherches dans le code de la bibliothèque moi-même. J'ai fini par le modifier, bien que pas beaucoup.

Dans la méthode privée '_privatekey_login' de SSH2.php (appelée à partir de la méthode de connexion lorsqu'il y a une clé), il y a du code à la fin de la méthode pour gérer l'échec de l'authentification.

extract(unpack('Ctype', $this->_string_shift($response, 1)));

switch ($type) {
   case NET_SSH2_MSG_USERAUTH_FAILURE:
      // soit la connexion est incorrecte, soit le serveur utilise une authentification multi-facteurs
      return false;
   case NET_SSH2_MSG_USERAUTH_SUCCESS:
      $this->bitmap |= NET_SSH2_MASK_LOGIN;
      return true;
}

Après avoir ajouté des journaux, j'ai constaté que la réponse que je recevais du serveur était effectivement "password,keyboard-interactive".

J'ai modifié toutes les méthodes de connexion (à la fois dans les classes SFTP ET SSH2) pour prendre un deuxième mot de passe, le passant jusqu'à la méthode '_privatekey_login'. J'ai ensuite modifié la section ci-dessus comme suit:

extract(unpack('Ctype', $this->_string_shift($response, 1)));

switch ($type) {
   case NET_SSH2_MSG_USERAUTH_FAILURE:
      // Authentification multi-facteurs possible.
      if ($password && $this->_keyboard_interactive_login($username, $password)) {
         $this->bitmap |= NET_SSH2_MASK_LOGIN;
         return true;
      }
      // la connexion est incorrecte.
      return false;
   case NET_SSH2_MSG_USERAUTH_SUCCESS:
      $this->bitmap |= NET_SSH2_MASK_LOGIN;
      return true;
}

J'ai copié l'appel interactif par clavier d'une autre partie du code, donc certaines parties pourraient ne pas être complètement nécessaires. Bien que cela puisse ne pas s'appliquer à tous les serveurs, cela a très bien fonctionné dans mon cas.

1voto

Bouke Versteegh Points 199

Réponse simple et courte : d'abord se connecter avec user+clé, puis se connecter avec user+pass.

$host = 'ftp.example.com';
$username = 'username';
$password = 'secret';
$key = new RSA();
$key->load(file_get_contents('~/.ssh/private_key.pem'));

$sftp = new SFTP($host);

if ($sftp->login($username, $key) || $sftp->login($username, $secret)) {
    // réussite
} else {
    // échec
}

Oui, cela a déjà été mentionné, mais de longues notes l'ont rendu obscur et compliqué.

0voto

Mike Points 5108

J'ai décidé de supprimer ma réponse précédente car il s'avère que j'avais tort; vous pouvez mettre en place des connexions multi-facteurs avec SSH, mais pas de manière standard. Aucune de ces méthodes d'authentification n'est native ou intégrée à openssh et il n'y a donc pas de méthode standard pour le faire. La plupart utilisent Google Authenticator pour fournir un mot de passe à usage unique, mais il y a des différences. Selon ce que ce site recommande, il semble que cela se fasse en invoquant une commande APRÈS que l'utilisateur a été authentifié par le serveur SSH. En regardant le code source de phpseclib dans Net/SSH2.php dans la méthode login(), voici le code suivant:

case NET_SSH2_MSG_USERAUTH_FAILURE:
    // pouvons-nous utiliser l'authentification interactive par clavier ? si ce n'est pas le cas alors soit la connexion est mauvaise, soit le serveur emploie
    // l'authentification multi-facteurs
    [...]
    return false;

Même les développeurs de phpseclib ont réalisé que l'authentification multi-facteurs est possible, mais en raison du manque de normes, ils n'ont pas jugé utile de le coder. Si vous cherchez sur Google votre code d'erreur

authenticated with partial success

vous verrez que c'est ainsi que le serveur auquel vous essayez de vous connecter est configuré. Si vous souhaitez coder une authentification multi-facteurs spécifique à la configuration de votre serveur, je ne vois pas pourquoi ce ne serait pas possible. Voici le fichier que vous auriez besoin de modifier pour le faire.

-2voto

Vous pouvez utiliser les liaisons SSH2 dans PECL. Il prend en charge tous les mécanismes d'authentification que vous avez mentionnés et fonctionne assez bien.

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