Impossible de créer un utilisateur avec un mot de passe via ssh

J’ai essayé de créer un utilisateur avec mot de passe via ssh (avec la permission root) comme ceci:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser 

Ce faisant, je pouvais créer un compte nommé newuser , mais je ne pouvais pas me connecter avec le mot de passe attendu (qui est 1234 ).

Cela ne change rien si j’ajoute des guillemets:

 ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser" 

Et puis je me demandais si je pouvais générer un mot de passe haché et le sauvegarder en tant que variable localement, mais toujours sans succès.

 password=$(openssl passwd -1 1234) ssh [email protected] "useradd -p $password newuser" 

Y a-t-il quelque chose qui me manque? Merci d’avance!

C’est un problème de citation classique.

Problème: sans guillemets ni doubles guillemets, la substitution de commande ( $() ) et le développement de variable (les $ s dans le mot de passe haché renvoyés par openssl sont traités comme des indicateurs de variable) sont effectués dans l’environnement local, pas sur le shell distant .

Solution: utilisez des guillemets simples autour de la commande useradd utilisée avec ssh sur le shell local pour empêcher la substitution de commande et le développement de variables sur l’environnement local. Laissez les extensions se dérouler sur le shell distant, non connecté et non interactif:

 ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser' 

Notez les citations.

Les problèmes de sécurité:

  • La connexion root SSH doit être désactivée. Si vous devez l’activer, seule l’authentification par clé doit être autorisée.

  • MD5 est déjà cassé et sans sel, vous êtes soumis à une attaque de table Rainbow (vous n’avez même pas besoin d’attaque brutale / avec dictionnaire); openssl passwd génère cependant un sel aléatoire. Quoi qu’il en soit, vous devriez vraiment envisager d’utiliser SHA-2 avec du sel-ing

  • Les mots de passe transmis en tant qu’arguments aux commandes peuvent être visibles par d’autres processus du système (distant). cela dépend de la manière dont votre procfs est monté (regardez hidepid ), et si la commande est en hidepid se réécrire elle-même (il est probable que ce ne soit pas le cas)

Comme @heemayl l’a noté, l’algorithme de hachage de mot de passe MD5 est ancien et les systèmes actuels, les hachages de mot de passe basés sur SHA-2 plus récents, qui ont un facteur de travail personnalisable. Mais l’outil de ligne de commande OpenSSL ne semble pas les prendre en charge.

L’utilitaire chpasswd , cependant, vous permettra de changer le mot de passe d’un utilisateur en fonction des parameters du système.

Cela devrait vous permettre de créer le nouvel utilisateur et de changer son mot de passe du côté distant.

 echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswd prend le nom d’utilisateur et le mot de passe de stdin, pas la ligne de commande. C’est en fait un avantage, car les arguments de ligne de commande sont visibles pour tous les autres processus du système. Par conséquent, si vous exécutez openssl passwd sur la télécommande, le mot de passe sera momentanément visible pour tous les processus du système.

Je ne sais pas s’il existe un utilitaire de ligne de commande prêt à l’emploi permettant de générer des hachages de mots de passe connus de la fonction système crypt(3) . Perl a la fonction de cryptage intégrée, mais un sel approprié doit toujours être généré.