Générer manuellement un mot de passe pour / etc / shadow

109

J'ai besoin de modifier manuellement /etc/shadowpour changer le mot de passe root à l'intérieur d'une image de machine virtuelle.

Existe-t-il un outil de ligne de commande qui prend un mot de passe et génère un /etc/shadowhachage de mot de passe compatible à la sortie standard?

Lorin Hochstein
la source

Réponses:

126

Vous pouvez utiliser les commandes suivantes pour la même chose:

Méthode 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

Remarque: le passage -1générera un mot de passe MD5, -5un SHA256 et un -6SHA512 (recommandé)

Méthode 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

Accepte les méthodes md5, sha-256etsha-512

Méthode 3 (des, md5, sha256, sha512)

Comme @tink l'a suggéré, nous pouvons mettre à jour le mot de passe en chpasswdutilisant:

echo "username:password" | chpasswd 

Ou vous pouvez utiliser un mot de passe crypté avec chpasswd. Commencez par le générer en utilisant ceci:

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

Ensuite, vous pourrez utiliser le mot de passe généré pour mettre à jour:

echo "username:encryptedPassWd"  | chpasswd -e

Ce mot de passe crypté que nous pouvons utiliser pour créer un nouvel utilisateur avec un mot de passe, par exemple:

useradd -p 'encryptedPassWd'  username
Rahul Patil
la source
3
Lors de l'utilisation chpasswd -e, veillez à utiliser des guillemets simples sur la chaîne echodans laquelle vous vous trouvez ; sinon, s'il y a $ou d'autres caractères spéciaux, ils ne seront pas traités littéralement.
Drapeaux
4
Notez que ces éléments se retrouveront dans l’historique de votre shell. J'utiliserais openssl passwd -1lequel 1) ne se termine pas là et 2) génère un sel aléatoire pour vous (qui ne se termine pas dans l'historique du shell, non plus).
Ztyx
1
openssl passwddocumentation pour ceux qui essaient de comprendre ce que fait l’ -1option.
CivFan
4
Pour un hachage SHA-512: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- d'une question ServerFault liée
CivFan
9
Les méthodes 1) et 2) ci-dessus utilisent MD5 pour le hachage. Le MD5 n'est plus considéré comme la meilleure pratique, car il y a eu des collisions de hachage. Utilisez la méthode 3) ou celle décrite dans unix.stackexchange.com/a/198906/10911 .
Ztyx
36

Sur Ubuntu 12.04, il y a mkpasswd (du paquetage whois): interface frontale surexploitée à crypt (3)

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass

Où:

  • -m= Calculez le mot de passe en utilisant la méthode TYPE. Si TYPE est help, les méthodes disponibles sont imprimées.
  • -S = sel utilisé.

Par exemple

$ mkpasswd -m help

-s = Read password from stdin
utilisateur3183018
la source
8
Il n'est pas nécessaire de spécifier le sel, mkpasswd se charge de générer un sel de manière aléatoire.
Vers SE
1
Quoi qu'il en soit, les mots de passe générés à partir de mkpasswd copiés dans le fichier / etc / passwd échouent toujours. Existe-t-il un moyen de vérifier si le hachage créé par mkpasswd est correct?
CMCDragonkai
@CMCDragonkai: Mauvaise question. Vous devez demander ce que votre système attend.
user3183018
1
@To 마 SE: Il est parfois utile de contrôler le sel. Je l'ai utilisé lors du test de la génération de hachage de mots de passe pour les applications Web où je stockais le sel dans un magasin séparé. Par exemple, le mot de passe haché dans la base de données MySQL et le mot de passe utilisateur dans Redis.
user3183018
15

Cette solution présente les avantages suivants:

  • Rien de plus à installer
  • Ne stocke pas le mot de passe dans l'historique de votre shell
  • Génère un sel aléatoire pour vous
  • Utilise un algorithme de hachage moderne et puissant, SHA-512
  • Re-demande le mot de passe pour éviter les erreurs.

    $ python3 -c "from getpass import getpass; from crypt import *; \
        p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
        if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
    

Références

u150825
la source
3

Pour ceux sans systèmes basés sur Debian. Python3 fonctionne aussi bien.

python3 -c 'import crypt; print(crypt.crypt("test"))'

REMARQUE: La chaîne "test" est le mot de passe que nous générons en tant que chaîne cryptée.

Greg
la source
Pour une raison quelconque, l'utilisation crypt.mksaltne fonctionne pas lors de la génération de mots de passe pour /etc/shadow. Mais la méthode de @ Alex131089 fonctionne!
maulinglawns
Je viens de perdre 1,5h à essayer cette méthode avant de remarquer le commentaire. Quelqu'un peut-il l'enlever? Je ne peux pas encore voter.
Michał F
1
@ MichałF, il semble que cela ne fonctionne pas car le salage n'a pas été effectué correctement. Merci de l'avoir signalé. J'ai retiré le sel parce que le salage dépend du système d'exploitation et qu'il n'est pas pratique de prendre en compte toutes les plages de système d'exploitation dans ma réponse. Vous devriez utiliser la méthode 1 décrite par @RahulPatil, car elle vous permet d'utiliser le salage et opensslconstitue un outil assez universel.
Greg
Ce n'est pas conseillé car cela laisse votre mot de passe dans l'historique de votre shell.
Mark Stosberg
Je veux dire, vous pouvez toujours effacer le cmd de votre historique de coquilles
Greg
3

Aucune des méthodes actuelles ne me convient: elles transmettent le mot de passe en ligne de commande (ce qui se trouve dans l'historique de mon shell), nécessitent l'installation d'utilitaires supplémentaires ( python3, makepasswd), utilisent des sels codés en dur ou utilisent d'anciennes techniques de hachage.

Cette méthode générerait des hachages SHA-512 après avoir demandé le mot de passe et utiliserait un sel aléatoire.

Une méthode utilisant Python 2 sans aucune bibliothèque non standard:

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'

Pour le faire sans invite: (Ceci laissera votre mot de passe dans l'historique des commandes)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
Gert van den Berg
la source
2
Pour éviter de laisser le mot de passe dans l'historique des commandes, vous pouvez définir (pour bash, au moins) la variable d'environnement HISTCONTROL sur 'espace ignoré', puis ajouter un espace de début devant la commande.
adam820
@ adam820: C'est un moyen ... Cela resterait dans la pssortie en une fraction de seconde pendant l'exécution de la commande. (Le plus sûr reste d'utiliser la version qui demande le mot de passe)
Gert van den Berg
2

La paire opensslet chpasswd -en'a pas fonctionné dans mon cas sous RHEL6. La combinaison openssl passwdet le usermod -pcommandement ont fait le travail.

Générez la valeur de hachage du mot de passe avec la valeur du sel:

$ openssl passwd -1  -salt 5RPVAd clear-text-passwd43

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Ensuite, copiez la chaîne cryptée sur usermod. Assurez-vous de l'envelopper avec des guillemets simples.

$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root

Vérifiez-le dans un fichier shadow.

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
Joon Byun
la source
1

Une autre méthode pour générer des mots de passe consiste à utiliser l' openssloutil.

Générer des mots de passe MD5

openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/

Générer des mots de passe DES

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
Evgeny
la source
3
En quoi cela diffère-t-il de la méthode 1 dans la réponse de Rahul Patil ? Notez que l'ancien algorithme de hachage de mot de passe basé sur DES ne doit absolument pas être utilisé! D'une part, il ne prend en charge que les mots de passe de huit octets au maximum, ce qui est terriblement insuffisant de nos jours.
un CVn
3
Citant Snowden: "Supposez que votre adversaire est capable d'un billion de devinettes par seconde." Avec un jeu de caractères non déraisonnable de 70 caractères et un mot de passe totalement aléatoire, le délai est de 576 secondes, soit moins de dix minutes. Même contre un adversaire moins capable mais déterminé, il est terriblement insuffisant .
un CVn
Ce n'est pas très sûr, car le MD5 et le DES ...
AdamKalisz
Merci d'être la seule réponse montrant comment chiffrer les mots de passe DES! Très utile pour essayer de remplacer le mot de passe root pour un micrologiciel de caméra IP.
Malvineous le
1

En développant un peu les critiques de u150825 et de Gert van den Berg, j'ai eu besoin de quelque chose de relativement flexible pour différentes situations avec différents systèmes d'automatisation. J'ai décidé d'ajouter à ma propre petite bibliothèque de scripts utiles et d'écrire ceci. Il utilise uniquement les bibliothèques natives de Python 2.7+ et fonctionne également sur python3.

Vous pouvez le chercher ici si vous voulez. Il est tout aussi facile de laisser tomber cela dans votre environnement si vous avez besoin de l'utiliser beaucoup, hébergé par http ou autre, et vous pouvez l'exécuter sur n'importe quelle plate-forme en utilisant quel que soit l'interpréteur python par défaut dont vous disposez, joli comptant de manière fiable sur son fonctionnement.

Par défaut, l'invite utilise getpass avec des invites sur stderr (permettant de capturer facilement stdout), mais si vous dirigez une chaîne vers elle, elle ne fera que sortir de stdin. Selon votre façon de faire, cela n'apparaît peut-être pas dans l'historique des commandes, alors soyez simplement conscient de ce avec quoi vous travaillez. J'aime avoir un outil flexible qui se comportera de la manière attendue, plutôt que de devoir compter sur des packages ou sur des paquets python pour gagner de 10 façons différentes.

James Harmison
la source
Que python, quelle que soit la version, est déjà installé ou non, dépend du système. Quel est le problème avec exactement chpasswd?
RalfFriedl