Genere manualmente la contraseña para / etc / shadow

109

Necesito editar manualmente /etc/shadowpara cambiar la contraseña de root dentro de una imagen de máquina virtual.

¿Existe una herramienta de línea de comandos que toma una contraseña y genera un /etc/shadowhash de contraseña compatible en la salida estándar?

Lorin Hochstein
fuente

Respuestas:

126

Puede usar los siguientes comandos para lo mismo:

Método 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

Nota: pasar -1generará una contraseña MD5, -5un SHA256 y -6SHA512 (recomendado)

Método 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

Métodos acepta md5, sha-256ysha-512

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

Como @tink sugirió, podemos actualizar la contraseña chpasswdusando:

echo "username:password" | chpasswd 

O puede usar una contraseña cifrada con chpasswd. Primero generarlo usando esto:

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

Luego, puede usar la contraseña generada para actualizar:

echo "username:encryptedPassWd"  | chpasswd -e

Esta contraseña cifrada la podemos usar para crear un nuevo usuario con contraseña, por ejemplo:

useradd -p 'encryptedPassWd'  username
Rahul Patil
fuente
3
Cuando lo use chpasswd -e, asegúrese de usar comillas simples en la cadena echoen la que se encuentra; de lo contrario, si hay $u otros caracteres especiales, no serán tratados literalmente.
Zags
44
Tenga en cuenta que la marca de estos terminará en su historial de shell. Usaría openssl passwd -1cuál 1) no termina allí y 2) genera una sal aleatoria para usted (que tampoco termina en el historial de shell).
Ztyx
1
openssl passwddocumentación para cualquiera que intente descubrir qué hace la -1opción.
CivFan
44
Para un hash SHA-512: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- de la pregunta relacionada ServerFault
CivFan
99
Los métodos 1) y 2) anteriores usan MD5 para el hash. MD5 ya no se considera la mejor práctica, ya que ha habido colisiones de hash. Utilice el método 3) o el que se describe en unix.stackexchange.com/a/198906/10911 .
Ztyx
36

En Ubuntu 12.04, hay mkpasswd (del paquete whois): front end sobrefeatured para crypt (3)

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

Dónde:

  • -m= Calcular la contraseña usando el método TYPE. Si TYPE es de ayuda, se imprimen los métodos disponibles.
  • -S = sal utilizada.

P.ej

$ mkpasswd -m help

-s = Read password from stdin
usuario3183018
fuente
8
No es necesario especificar la sal, mkpasswd se encarga de generar una aleatoria.
A 마 SE
1
Pase lo que pase, las contraseñas generadas desde mkpasswd copiadas en / etc / passwd siempre fallan. ¿Hay alguna manera de verificar si el hash creado por mkpasswd es correcto?
CMCDragonkai
@CMCDragonkai: Pregunta incorrecta. Debe preguntar qué espera su sistema.
user3183018
1
@To 마 SE: A veces es útil controlar la sal. Lo he usado al probar la generación de contraseñas hash para la aplicación web donde estaba almacenando la sal en una tienda separada. Por ejemplo, contraseña hash en MySQL DB, y sal por usuario en Redis.
user3183018
15

Esta solución tiene los siguientes beneficios:

  • Nada adicional para instalar
  • No almacena la contraseña en su historial de shell
  • Genera una sal al azar para ti
  • Utiliza un algoritmo hash moderno y fuerte, SHA-512
  • Vuelve a solicitar la contraseña para evitar errores.

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

Referencias

u150825
fuente
3

Para aquellos sin sistemas basados ​​en Debian. Python3 funciona igual de bien.

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

NOTA: La cadena "prueba" es la contraseña que estamos generando como una cadena encriptada.

Greg
fuente
Por alguna razón, el uso crypt.mksaltno funciona al generar contraseñas para /etc/shadow. ¡Pero el método de @ Alex131089 funciona!
maulinglawns
Solo desperdicié 1,5 horas probando este método, antes de notar el comentario. ¿Alguien puede quitarlo? No puedo votar abajo todavía.
Michał F
1
@ MichałF parece que esto no estaba funcionando porque la salazón no se hizo correctamente. Gracias por señalar esto. Eliminé la sal porque la sal depende del sistema operativo y no es práctico tener en cuenta todos los rangos del sistema operativo en mi respuesta. Debería usar el Método 1 descrito por @RahulPatil porque le permite usar la salazón y openssles una herramienta bastante universal.
Greg
No es aconsejable, ya que deja su contraseña en su historial de shell.
Mark Stosberg
Quiero decir, siempre puedes borrar el cmd de tu historial de shell
Greg
3

Ninguno de los métodos actuales es aceptable para mí: pasan la contraseña en la línea de comando (que termina en el historial de mi shell), requieren la instalación de utilidades adicionales ( python3, makepasswd), usan sales codificadas o usan viejas técnicas de hashing.

Este método generaría hashes SHA-512 después de solicitar la contraseña y usaría una sal aleatoria.

Un método que utiliza Python 2 sin ninguna biblioteca no estándar:

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

Para hacerlo sin un aviso: (Esto dejará su contraseña en el historial de comandos)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
Gert van den Berg
fuente
2
Para evitar dejar la contraseña en el historial de comandos, puede establecer (para bash, al menos) la variable de entorno HISTCONTROL en 'ignorespace', y luego agregar un espacio inicial delante del comando.
adam820
@ adam820: Esa es una forma ... Lo mantendría en la pssalida en una fracción de segundo que el comando se está ejecutando. (Lo más seguro es usar la versión que solicita la contraseña)
Gert van den Berg
2

El openssly el chpasswd -epar no funcionaron en mi caso en RHEL6. La combinación openssl passwdy el usermod -pcomando hicieron el trabajo.

Genere el valor hash de la contraseña junto con el valor de sal:

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

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Luego, copie la cadena encriptada a usermod. Asegúrese de envolverlo con comillas simples.

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

Compruébalo en el archivo de sombra.

$ grep root /etc/shadow

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

Otro método más para generar contraseñas es usar la opensslherramienta.

Generar contraseñas MD5

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

Generar contraseñas DES

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
Evgeny
fuente
3
¿Cómo es esto diferente del método 1 en la respuesta de Rahul Patil ? ¡Tenga en cuenta que el antiguo algoritmo de hash de contraseña basado en DES definitivamente no debe usarse! Por un lado, solo admite contraseñas de hasta ocho bytes, lo cual es lamentablemente inadecuado en estos días.
un CVn
3
Citando a Snowden: "Suponga que su adversario es capaz de hacer un billón de conjeturas por segundo". Con un juego de caracteres de 70 caracteres no totalmente irrazonable y una contraseña totalmente aleatoria, eso es 576 segundos, menos de diez minutos. Incluso contra un adversario menos capaz pero determinado, es lamentablemente inadecuado .
un CVn
Esto no es muy seguro, porque MD5 y DES ...
AdamKalisz
¡Gracias por ser la única respuesta que muestra cómo cifrar las contraseñas DES! Muy útil para intentar anular la contraseña de root para el firmware de una cámara IP.
Malvineous
1

Ampliando un poco las críticas a u150825 y Gert van den Berg, me encontré necesitando algo relativamente flexible para diferentes situaciones con diferentes sistemas de automatización. Decidí agregar a mi pequeña biblioteca de scripts útiles y escribir esto. Utiliza solo bibliotecas nativas de python 2.7+, y también funciona en python3.

Puedes recogerlo aquí si quieres. Es tan fácil dejar esto en su entorno si necesita usarlo mucho, alojado en http o lo que sea, y puede ejecutarlo en cualquier plataforma usando el intérprete de python predeterminado que tenga disponible, es bastante contando confiablemente con que funcione.

El valor predeterminado es solicitar usando getpass con mensajes en stderr (permitiendo una captura fácil de stdout), pero si conecta una cadena a ella, simplemente cosechará desde stdin. Dependiendo de cómo lo haga, es posible que tampoco aparezca en el historial de comandos, así que tenga en cuenta con qué está trabajando. Me gusta tener una herramienta flexible que se comporte de la manera esperada, en lugar de tener que depender de paquetes o python que alinean mi camino hacia la victoria de 10 maneras diferentes.

James Harmison
fuente
Si Python en cualquier versión ya está instalada o no depende del sistema. ¿Cuál es exactamente el problema chpasswd?
RalfFriedl