Generare manualmente la password per / etc / shadow


109

Devo modificare manualmente /etc/shadowper cambiare la password di root all'interno di un'immagine della macchina virtuale.

Esiste uno strumento da riga di comando che accetta una password e genera un /etc/shadowhash password compatibile in uscita standard?

Risposte:


126

Puoi usare i seguenti comandi per lo stesso:

Metodo 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

Nota: il passaggio -1genererà una password MD5, -5un SHA256 e -6SHA512 (consigliato)

Metodo 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

Metodi accetta md5, sha-256esha-512

Metodo 3 (des, md5, sha256, sha512)

Come suggerito da @tink, possiamo aggiornare la password chpasswdusando:

echo "username:password" | chpasswd 

Oppure puoi usare la password crittografata con chpasswd. Per prima cosa generalo usando questo:

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

Successivamente puoi utilizzare la password generata per aggiornare:

echo "username:encryptedPassWd"  | chpasswd -e

Questa password crittografata che possiamo utilizzare per creare un nuovo utente con password, ad esempio:

useradd -p 'encryptedPassWd'  username

3
Quando si utilizza chpasswd -e, assicurarsi di utilizzare virgolette singole sulla stringa in cui ci si trova echo; altrimenti, se ci sono $o altri caratteri speciali, non verranno trattati alla lettera.
Zags,

4
Si noti che questi ultimi finiranno nella cronologia della shell. Vorrei usare openssl passwd -1quale 1) non finisce lì e 2) genera un salt casuale per te (che non finisce nemmeno nella storia della shell).
Ztyx,

1
openssl passwddocumentazione per chiunque cerchi di capire cosa fa l' -1opzione.
CivFan,

4
Per un hash SHA-512: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- dalla relativa domanda ServerFault
CivFan,

9
Il metodo 1) e 2) sopra utilizza MD5 per l'hash. MD5 non è più considerata la migliore pratica in quanto vi sono state collisioni di hash. Utilizzare il metodo 3) o quello descritto in unix.stackexchange.com/a/198906/10911 .
Ztyx,

36

Su Ubuntu 12.04, c'è mkpasswd (dal pacchetto whois): front-end con funzionalità eccessive per crypt (3)

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

Dove:

  • -m= Calcola la password usando il metodo TYPE. Se TYPE è di aiuto, vengono stampati i metodi disponibili.
  • -S = sale usato.

Per esempio

$ mkpasswd -m help

-s = Read password from stdin

8
Non è necessario specificare il sale, mkpasswd si occupa di generarne uno casuale.
A 마 SE

1
Non importa quale sia, le password generate da mkpasswd copiate in / etc / passwd falliscono sempre. C'è un modo per verificare se l'hash creato da mkpasswd è corretto?
CMCDragonkai

@CMCDragonkai: domanda sbagliata. Devi chiedere cosa si aspetta il tuo sistema.
user3183018

1
@To 마 SE: A volte è utile controllare il sale. L'ho usato durante il test della generazione hash di password per l'app Web in cui stavo memorizzando il sale in un negozio separato. Ad esempio password con hash in MySQL DB e salt per utente in Redis.
user3183018

15

Questa soluzione ha i seguenti vantaggi:

  • Niente di aggiuntivo da installare
  • Non memorizza la password nella cronologia della shell
  • Genera un sale casuale per te
  • Utilizza un algoritmo di hashing moderno e potente, SHA-512
  • Richiede nuovamente la password per evitare errori.

    $ 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.')"
    

Riferimenti


3

Per quelli senza sistemi basati su Debian. Python3 funziona altrettanto bene.

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

NOTA: la stringa "test" è la password che stiamo generando come stringa crittografata.


Per qualche motivo, l'utilizzo crypt.mksaltnon funziona quando si generano password per /etc/shadow. Ma il metodo di @ Alex131089 funziona!
Maulinglawns,

Ho appena perso 1,5 ore a provare questo metodo, prima di notare il commento. Qualcuno può rimuoverlo? Non posso ancora sottovalutare.
Michał F,

1
@ MichałF sembra che non funzioni perché la salatura non è stata eseguita correttamente. Grazie per averlo segnalato. Ho rimosso il sale perché la salatura dipende dal sistema operativo e non è pratico tenere conto di tutte le gamme di sistema operativo nella mia risposta. Dovresti usare il Metodo 1 delineato da @RahulPatil perché ti consente di usare la salatura ed opensslè uno strumento piuttosto universale.
Greg,

Non consigliabile, poiché lascia la password nella cronologia della shell.
Mark Stosberg,

Voglio dire, puoi sempre cancellare il cmd dalla cronologia della tua shell
Greg

3

Nessuno dei metodi attuali è accettabile per me - Passano la password dalla riga di comando (che finisce nella storia della mia shell), richiedono l'installazione di utilità aggiuntive ( python3, makepasswd), usano sali hard-coded o usano vecchie tecniche di hashing.

Questo metodo genererebbe hash SHA-512 dopo aver richiesto la password e userebbe un salt casuale.

Un metodo che utilizza Python 2 senza librerie non standard:

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

Per farlo senza un prompt: (Questo lascerà la tua password nella cronologia dei comandi)

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

2
Per evitare di lasciare la password nella cronologia dei comandi, è possibile impostare (almeno per bash) la variabile di ambiente HISTCONTROL su 'ignorespace', quindi aggiungere uno spazio iniziale davanti al comando.
adam820,

@ adam820: Questo è un modo ... Sarebbe ancora psnell'output nella frazione di secondo che il comando è in esecuzione. (Il più sicuro rimane usare la versione che richiede la password)
Gert van den Berg

2

La coppia openssle chpasswd -enon ha funzionato nel mio caso in RHEL6. Combinazione openssl passwde usermod -pcomando hanno fatto il lavoro.

Genera il valore hash della password insieme al valore salt:

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

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Quindi, copia la stringa crittografata su usermod. Assicurati di avvolgerlo tra virgolette singole.

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

Dai un'occhiata nel file shadow.

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::

1

Ancora un altro metodo per generare password, sta usando lo opensslstrumento.

Genera password MD5

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

Genera password DES

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2

3
In che modo differisce dal metodo 1 nella risposta di Rahul Patil ? Si noti che il vecchio algoritmo di hashing delle password basato su DES non dovrebbe assolutamente essere usato! Per prima cosa, supporta solo password fino a otto byte, il che è tristemente inadeguato in questi giorni.
un CVn

3
Citando Snowden: "Supponi che il tuo avversario sia capace di trilioni di ipotesi al secondo." Con un set di caratteri di 70 caratteri non del tutto irragionevole e una password completamente casuale, sono 576 secondi, meno di dieci minuti. Anche contro un avversario meno capace ma determinato, è terribilmente inadeguato .
un CVn

Questo non è molto sicuro, perché MD5 e DES ...
AdamKalisz,

Grazie per essere l'unica risposta che mostra come crittografare le password DES! Molto utile per provare a sovrascrivere la password di root per un firmware della telecamera IP.
Malvineous,

1

Espandendo un po 'le critiche di u150825 e Gert van den Berg, mi sono ritrovato a necessitare di qualcosa di relativamente flessibile per diverse situazioni con diversi sistemi di automazione. Ho deciso di aggiungere alla mia piccola libreria di script utili e scrivere questo. Utilizza solo librerie native di Python 2.7+ e funziona anche su Python3.

Puoi prenderlo qui se vuoi. È altrettanto facile rilasciarlo nel tuo ambiente se hai bisogno di usarlo molto, ospitato in http o altro, e puoi eseguirlo su qualsiasi piattaforma usando qualunque sia l'interprete predefinito di Python che hai a disposizione, carino contando in modo affidabile sul suo funzionamento.

Per impostazione predefinita, viene richiesto di utilizzare getpass con prompt su stderr (che consente di catturare facilmente stdout), ma se si inoltra una stringa su di essa, si raccoglierà semplicemente da stdin. A seconda di come lo stai facendo, potrebbe non apparire nella cronologia dei comandi, quindi sii consapevole di ciò con cui stai lavorando. Mi piace avere uno strumento flessibile che si comporterà in modo atteso, piuttosto che dover fare affidamento su pacchetti o python che mi orientano verso la vittoria in 10 modi diversi.


Se python in qualunque versione sia già installato o meno dipende dal sistema. Qual è esattamente il problema chpasswd?
RalfFriedl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.