web-dev-qa-db-fra.com

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

J'ai essayé de créer un utilisateur avec un 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 avec succès un compte nommé newuser, mais je ne pouvais pas me connecter avec le mot de passe attendu (qui est 1234).

Cela ne fait aucune différence 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!

13
amigcamel

C'est un problème de citation classique.

Problème: Sans citation ni double citation, la substitution de commande ($()) et le développement de variable (le $s du mot de passe haché renvoyé par opensslsont traités comme un indicateur de variable) sont effectués dans l'environnement local, et non sur le Shell distant.

Solution: utilisez des guillemets simples autour de la commande useraddutilisée avec sshsur le shell local pour empêcher la substitution de commande et le développement de variables sur un environnement local, laissez les extensions se dérouler sur le serveur distant non connecté, non interactif. Coquille:

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

Notez les citations.

Problèmes de sécurité:

  • SSH rootlogin devrait être désactivé. 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 procfsest monté (regardez hidepidname__), et si la commande est en train de se réécrire (ce cas, vraisemblablement, ce n'est pas le cas)

22
heemayl

Comme @heemayl l'a noté, l'algorithme de hachage de mot de passe MD5 est ancien et les systèmes actuels, les nouveaux hachages de mot de passe basés sur SHA-2, 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 vous permettra toutefois de modifier le mot de passe d'un utilisateur en fonction des paramètres 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. Il s'agit en fait d'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 system crypt(3). Perl a la fonction crypt intégrée, mais il faudra tout de même générer un sel approprié.

7
ilkkachu