No se puede crear un usuario con contraseña a través de ssh [cerrado]

13

Intenté crear un usuario con contraseña a través de ssh (con permiso de root) como este:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser

Al hacerlo, pude crear con éxito una cuenta llamada newuser, pero no pude iniciar sesión con la contraseña esperada (que es 1234)

No hay diferencia si agrego comillas dobles:

ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"

Y luego me preguntaba si puedo generar una contraseña hash y guardarla como una variable local, pero aún sin suerte.

password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"

¿Hay algo que extraño? ¡Gracias por adelantado!

amigcamel
fuente
Pasar contraseñas en la línea de comandos es una mala idea porque otros usuarios pueden ver los argumentos de la línea de comandos. Ver la respuesta de heemayl para eso. Más allá de eso, esto suena como un problema XY . ¿Qué estás tratando de lograr realmente? ¿Cuál es el punto de una contraseña de cuenta que nadie conoce (o se supone que debe saber)? Si el objetivo es crear una cuenta que no acepte inicios de sesión mediante contraseña, simplemente no configure ninguna contraseña, lo que dejará deshabilitado el inicio de sesión basado en contraseña como política predeterminada de Ubuntu.
David Foerster

Respuestas:

22

Este es un problema clásico de citas.

Problema: sin comillas ni comillas dobles, la sustitución del comando ( $()) y la expansión variable (las $s en la contraseña hash devuelta por opensslse tratan como indicador variable) se realizan en el entorno local, no en el shell remoto.

Solución: utilice comillas simples alrededor del useraddcomando utilizado sshen el shell local para evitar la sustitución del comando y la expansión variable en el entorno local, permita que las expansiones se realicen en el shell remoto no interactivo y sin inicio de sesión:

ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'

Tenga en cuenta las citas.

Temas de seguridad:

  • El rootinicio de sesión SSH debe estar deshabilitado, si debe tenerlo habilitado, solo se debe permitir la autenticación basada en claves

  • MD5 ya está roto y, sin sal, está sujeto a un simple ataque de mesa Rainbow (ni siquiera necesita un ataque de fuerza bruta / diccionario); openssl passwdaunque genera una sal al azar. De todos modos, deberías considerar usar SHA-2 con sal

  • Las contraseñas pasadas como argumentos a los comandos pueden ser visibles para otros procesos en el sistema (remoto); esto depende de cómo procfsesté montado (mira hidepid), y si el comando se está reescribiendo (en este caso, presumiblemente no)

heemayl
fuente
1
Funciona de maravilla, y gracias por la información adicional!
amigcamel
1
el hash de contraseña md5crypt tiene sal ...
ilkkachu
@ilkkachu MD5 no es un hash seguro. Si está interesado, realice una búsqueda en Seguridad de la información . Realmente deberías usar un algoritmo compuesto o una biblioteca criptográfica, pero SHA-2 es significativamente mejor que MD5.
wizzwizz4
1
@ wizzwizz4 sí, eso es bien sabido, no cambia el hecho de que la información en esta respuesta es incorrecta. :)
hobbs
2
@ wizzwizz4, el hash de contraseña ( md5crypt ) compatible con crypt(3)Linux y marcado con el $1$identificador no es el mismo que el algoritmo de hash MD5 simple, de la misma manera que los hash de contraseña$5$ y SHA-256 y SHA-512 tampoco . El método basado en MD5 tiene un número fijo de iteraciones, que es el mayor problema con él. $6$
ilkkachu
7

Como señaló @heemayl, el algoritmo de hash de contraseña MD5 está obsoleto, y los sistemas actuales tienen los hash de contraseña más nuevos basados ​​en SHA-2, que tienen un factor de trabajo personalizable. Pero la herramienta de línea de comandos OpenSSL no parece admitirlos.

La chpasswdutilidad , sin embargo, se permitirá cambiar la contraseña de un usuario en función de la configuración del sistema.

Esto debería permitirle crear el nuevo usuario y cambiar su contraseña en el extremo remoto.

echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswdtoma el nombre de usuario y la contraseña de stdin, no la línea de comando. Esto es realmente una ventaja ya que los argumentos de la línea de comando son visibles para todos los demás procesos en el sistema, por lo que si se ejecuta openssl passwden el control remoto, la contraseña será momentáneamente visible para todos los procesos en el sistema.

No estoy seguro de si hay una utilidad de línea de comandos lista para generar hashes de contraseñas conocida por la crypt(3)función del sistema . Perl tiene la cryptfunción incorporada, pero aún sería necesario generar una sal adecuada.

ilkkachu
fuente