web-dev-qa-db-fra.com

mkpasswd -m sha-512 produit une connexion incorrecte

J'ai des problèmes pour essayer de définir des mots de passe pour mes nouveaux utilisateurs.

J'ai trouvé un tutoriel indiquant que mkpasswd -m sha-512 "my password here" produirait un mot de passe salé et haché pouvant être utilisé en combinaison avec useradd -m -p "hashed and salted passwd" -s /bin/bash username, mais lorsque j'ai essayé cela sur un utilisateur test, je continue de recevoir Incorrect Login.

J'utilise Ubuntu 16.04 et j'utilise mkpasswd à partir du paquet whois.

Qu'est-ce que je fais mal ici?


Étapes exactes

1) apt update

2) apt install whois

3) mkpasswd -m sha-512 "my password here"

produit: $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g.

4) useradd -m -p $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g. -s /bin/bash testuser

5) login testuser

Invites pour mot de passe:

6) tapez mon mot de passe ici

Dit: Login incorrect


J'aimerais ajouter que j'ai essayé la même chose avec un mot de passe qui ne contient aucun espace et omis les guillemets de la commande mkpasswd. Ni semblait faire une différence.

J'ai également essayé de rendre l'utilisateur sans l'indicateur -p (ce qui signifie ne pas ajouter de mot de passe) et j'ai copié manuellement le mot de passe haché/salé dans /etc/shadow, ce qui donne les mêmes résultats que ci-dessus, Login incorrect.


Encore plus intéressant, si j’utilise un sous-shell pour indiquer la valeur, tout semble fonctionner correctement.

useradd -m -p $(mkpasswd -m sha-512 "my password") -s /bin/bash test

login test type: my password

Se connecte très bien!

3
Neurax

D'accord, j'ai verrouillé le problème. Étant donné que la sortie de mkpassword donnera $id$salt$hash, lorsque vous copiez-collez-la dans une commande useradd, bash essaiera de remplacer les variables sur $. En tant que tels, ceux-ci doivent être échappés en utilisant \$id\$salt\$hash afin que bash ne remplace pas les variables avant d'ajouter la chaîne à /etc/shadow.

mkpasswd -m sha-512 "my password" résulte en

$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

qui peuvent être copiés et collés dans useradd en prenant soin de remplacer chaque $ par \$.

useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

4
Neurax

Pourquoi cela arrive-t-il ?

Elle échoue parce que les éléments précédés de $ sont traités comme des variables et ne sont pas entre guillemets lorsque vous les transmettez à useradd.

Les parties $6..., $1... et $b... de votre hachage sont traitées comme des variables. Bien entendu, le problème vient du shell: les shells effectuent un développement variable (à moins qu’ils ne soient cités) avant que quoi que ce soit ne soit exécuté. Et comme ces 3 variables n'existent pas dans votre environnement, elles disparaissent de la chaîne que vous passez à useradd.

Exemple pratique:

Voyons quelle commande actuelle est exécutée une fois que le shell a terminé toutes les extensions et les substitutions nécessaires et l'a transférée à execve() appel système. Comparer:

$ strace -e execve useradd -p $abra$cadabra newuser                                                                                                                    
execve("/usr/sbin/useradd", ["useradd", "-p", "newuser"], [/* 82 vars */]) = 0

$ strace -e trace=execve useradd -p '$abra$cadabra' newuser                                                                                                            
execve("/usr/sbin/useradd", ["useradd", "-p", "$abra$cadabra", "newuser"], [/* 82 vars */]) = 0

Dans le premier exemple, $abra$cadabra (où votre hachage irait) disparaît de la commande qui doit être exécutée par le système. En revanche, la simple citation $abra$cadabra dans le deuxième exemple apparaît dans la liste des arguments qui sont transmis à execve().

En d’autres termes, vous avez généré un hachage correct, mais Shell transmet en argument un paramètre complètement différent de useradd, qui correspond en définitive à la commande exécutée par le système. En fait, prenons votre hash par exemple et comparons deux cas de cotation et de non-cotation:

$ strace -e execve echo $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g                                                            
execve("/bin/echo", ["echo", "FuuSdKgVke.LYTfrlknm5cWx65g"], [/* 82 vars */]) = 0
FuuSdKgVke.LYTfrlknm5cWx65g
+++ exited with 0 +++

Notez que ce que le système voit réellement après que le shell a fini de traiter les variables est FuuSdKgVke.LYTfrlknm5cWx65g. Mais il verra le hachage correct si vous le citez:

$ strace -e execve echo '$6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g'                                                          
execve("/bin/echo", ["echo", "$6$1FuuSdKgVke$bc8doOVGZhzomoeaf"...], [/* 82 vars */]) = 0

Ce qui peut être fait ? Ce qui fonctionne ?

Cependant, le sous-shell fonctionne car il n’ya pas de remplacement, il n’ya pas de variables. Et citer aussi fonctionne pour la même raison.

Voici quelques méthodes:

  1. Substitution de commande:

    $ Sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr        
    >
    $ su newusr
    Password: 
    newusr@ubuntu1604:/home/admin$ 
    
  2. Citations simples (notez que j'ai coupé le hachage réel car il est trop long et ne rentre pas dans le formatage):

    $ Sudo -p ">" mkpasswd --hash=SHA-512 "112"
    >
    GVhvDY$vhw89D2X0bd2REQWE
    $ Sudo -p ">" useradd -m -s /bin/sh -p 'GVhvDY$vhw89D2X0bd2REQWE' newusr2
    > 
    $ su newusr2
    Password: 
    $ echo $USER
    newusr2
    
  3. Prend la sortie du flux mkpasswdstdout et la transmet via xargs avec le code -I:

    $ mkpasswd -m sha-512 'password1' | Sudo -p '>' xargs -I % useradd -p % newuser1 
    
  4. Ajoutez \ à chaque $ (où l'OP se trouve dans leur réponse ). Scriptable aussi, conformément à commentaire de George .

    $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
    
3