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?
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!
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
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
.
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
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:
Substitution de commande:
$ Sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr
>
$ su newusr
Password:
newusr@ubuntu1604:/home/admin$
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
Prend la sortie du flux mkpasswd
stdout
et la transmet via xargs
avec le code -I
:
$ mkpasswd -m sha-512 'password1' | Sudo -p '>' xargs -I % useradd -p % newuser1
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