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

13

J'ai essayé de créer un utilisateur avec mot de passe via ssh (avec l'autorisation root) comme ceci:

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

Ce faisant, j'ai réussi à créer un compte nommé newuser, mais je n'ai pas pu me connecter avec le mot de passe attendu (qui est 1234)

Cela ne fait aucune différence si j'ajoute des guillemets doubles:

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 l'enregistrer 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!

amigcamel
la source
Passer des mots de passe sur la ligne de commande est une mauvaise idée car les autres utilisateurs peuvent voir les arguments de la ligne de commande. Voir la réponse de heemayl pour cela. Au-delà de cela, cela ressemble à un problème XY . Qu'essayez-vous réellement de réaliser? Quel est l'intérêt d'un mot de passe de compte que personne ne connaît (ou n'est censé connaître)? Si le but est de créer un compte qui n'accepte pas les connexions par mot de passe, définissez simplement aucun mot de passe, ce qui laissera la connexion par mot de passe désactivée comme stratégie par défaut d'Ubuntu.
David Foerster

Réponses:

22

Il s'agit d'un problème de citation classique.

Problème: sans aucun guillemet ou double guillemet, la substitution de commande ( $()) et l'expansion de variable (les $s du mot de passe haché renvoyé par opensslsont traités comme un indicateur de variable) sont effectués dans l'environnement local, pas sur le shell distant.

Solution: utilisez des guillemets simples autour de la useraddcommande utilisée avec sshsur le shell local pour empêcher la substitution de commandes et l'expansion des variables sur l'environnement local, laissez les extensions se dérouler sur le shell distant sans connexion et non interactif:

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

Notez les citations.

Les problèmes de sécurité:

  • La rootconnexion SSH doit être désactivée, si vous devez l'avoir activée, seule l'authentification par clé doit être autorisée

  • MD5 est déjà cassé, et sans sel, vous êtes soumis à une simple attaque de table Rainbow (n'a même pas besoin de forçage brutal / d'attaque par dictionnaire); openssl passwdne génère cependant un sel aléatoire. Quoi qu'il en soit, vous devriez vraiment envisager d'utiliser SHA-2 avec du sel

  • Les mots de passe transmis comme arguments aux commandes peuvent être visibles par d'autres processus du système (distant); cela dépend de la façon dont votre procfsest monté (regardez hidepid), et si la commande se réécrit elle-même (ce cas, probablement pas)

heemayl
la source
1
Fonctionne comme un charme, et merci pour les informations supplémentaires!
amigcamel
1
le hachage de mot de passe md5crypt a un sel ...
ilkkachu
@ilkkachu MD5 n'est pas un hachage sécurisé. Si vous êtes intéressé, lancez une recherche sur la sécurité de l'information . Vraiment, vous devriez utiliser un algorithme composé ou une bibliothèque cryptographique, mais SHA-2 est nettement meilleur que MD5.
wizzwizz4
1
@ wizzwizz4 oui, c'est bien connu, cela ne change pas le fait que les informations de cette réponse sont incorrectes. :)
hobbs
2
@ wizzwizz4, le hachage de mot de passe ( md5crypt ) pris en charge par crypt(3)sous Linux et marqué avec l' $1$identifiant n'est pas le même que l'algorithme de hachage MD5 ordinaire, de la même manière que les hachages de mot de passe$5$ et ne sont pas non plus SHA-256 et SHA-512 non plus . La méthode basée sur MD5 a un nombre fixe d'itérations, ce qui est le plus gros problème. $6$
ilkkachu
7

Comme l'a noté @heemayl, l'algorithme de hachage de mot de passe MD5 est vieilli, 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' chpasswdutilitaire , cependant, vous permettra de changer le mot de passe d'un utilisateur en fonction des paramètres du système.

Cela devrait vous permettre de créer le nouvel utilisateur et de modifier son mot de passe sur l'extrémité distante.

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

chpasswdprend 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, donc s'il est exécuté openssl passwdsur la télécommande, le mot de passe sera momentanément visible par tous les processus du système.

Je ne sais pas s'il existe un utilitaire de ligne de commande prêt à l'emploi pour générer des hachages de mot de passe connus par la crypt(3)fonction système . Perl a la cryptfonction intégrée, mais un sel approprié devrait encore être généré.

ilkkachu
la source