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!
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 openssl
sont 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 useradd
utilisée avec ssh
sur 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 root
login 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 procfs
est monté (regardez hidepid
name__), et si la commande est en train de se réécrire (ce cas, vraisemblablement, ce n'est 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 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é.