¿Es posible ejecutar sshd como usuario normal?

39

sshdMi objetivo es iniciar una segunda instancia en un puerto no privilegiado (por ejemplo, 2222) con mi propio archivo de configuración.

Obviamente, el sshdproceso no puede setuidiniciar sesión ya que los usuarios que no sean el que ejecuta el sshddemonio son claramente imposibles.

Sin embargo, ¿es posible tener un sshddemonio que funcione para el usuario que se está ejecutando actualmente? Para mi caso de uso, esto estaría bien.

Intenté arrancar una sshdinstancia con mi propio archivo de configuración y clave de host y el sshdproceso se inicia (no tengo quejas de no ser root, como algunos comandos), sin embargo, cuando intento conectarme a ese puerto, el sshdproceso muere.

$ /usr/sbin/sshd -dD -h .ssh/id_rsa -p 2222 
debug1: sshd version OpenSSH_5.6p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: setgroups() failed: Operation not permitted
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-dD'
debug1: rexec_argv[2]='-h'
debug1: rexec_argv[3]='.ssh/id_rsa'
debug1: rexec_argv[4]='-p'
debug1: rexec_argv[5]='2222'
debug1: Bind to port 2222 on 0.0.0.0.
Server listening on 0.0.0.0 port 2222.
debug1: Bind to port 2222 on ::.
Server listening on :: port 2222.
debug1: fd 6 clearing O_NONBLOCK
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 6 out 6 newsock 6 pipe -1 sock 9
debug1: inetd sockets after dupping: 5, 5
Connection from ::1 port 57670
debug1: Client protocol version 2.0; client software version OpenSSH_5.6
debug1: match: OpenSSH_5.6 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.6
debug1: list_hostkey_types: 
No supported key exchange algorithms
debug1: do_cleanup
debug1: do_cleanup
debug1: audit_event: unhandled event 12

La debug1: setgroups() failed: Operation not permittedlínea obviamente sobresale, pero no muere hasta que intenta aceptar una conexión.

Bo Jeanes
fuente

Respuestas:

35

Después de investigar un poco, lo descubrí.

Comience el proceso con sshd -f ~/.ssh/sshd_configdónde /.ssh/sshd_configestá un nuevo archivo que creó. Entre otras opciones (como una clave de host diferente, un puerto diferente, etc.) debe agregar la línea UsePrivilegeSeparation no. Esto evitará que el sshdproceso intente hacer alguna llamada setuido setgidllamadas y le permitirá continuar ejecutándose como su usuario y aceptar conexiones como su usuario.

EDITAR: Unos momentos después de descubrirlo, alguien más me twitteó este enlace que confirma que esta es la forma correcta de hacer esto: http://cygwin.com/ml/cygwin/2008-04/msg00363.html

Bo Jeanes
fuente
1
También debe deshabilitar PAM estableciendo UsePamen no.
haridsv
@bjeanes, ¿funciona para ti? ¿Puedes compartir tu archivo sshd_config? se queja de que "Establecer" no es un comando válido para mí cuando lo intento en ubuntu.
jojo
@jojo No ejecuto esta configuración, así que no tengo ningún archivo para compartir. Tendrá que comenzar con un archivo de trabajo conocido y ajustarlo a sus necesidades.
Bo Jeanes
1
Lo que deshabilita PAM es solo para casos específicos. Funciona para mí en Fedora sin jugar con la configuración de pam. Vea el mensaje de correo electrónico vinculado en la respuesta para obtener más ideas sobre qué más se debe cambiar para que todo quede bien. Actualizaré pronto mis notas sobre cómo lo hice funcionar para docker: hub.docker.com/r/aosqe/ssh-git-server (espere un par de días antes de leerlo)
akostadinov
6

Como una actualización de este hilo, OpenSSH en la versión 7.5 desaprobó la opción UsePrivilegeSeparation, lo que hace imposible deshabilitar la separación de privilegios. Parece que ejecutar SSHD como usuario ahora es imposible.

Ver https://www.openssh.com/releasenotes.html

Linterna mágica
fuente
Dependiendo de la configuración del servidor, este puede no ser el caso. No tengo problemas para ejecutar sshd como usuario normal al indicar "UsePrivilegeSeparation yes" o "UsePrivilegeSeparation sandbox" en mi archivo de configuración sshd.
a3nm
Bueno, aún no lo he probado, pero creo que esto está "arreglado" ahora: "sshd (8): cuando se inicia sin privilegios de root, no requiere que exista el usuario o la ruta de separación de privilegios. Hace que la ejecución de las pruebas de regresión sea más fácil sin tocar el sistema de archivos ".
Daniel Santos
2

He comprobado en detalle la posibilidad de ejecutar el servicio sshd como usuario normal. Detalle de la versión del programa:

Versión sshd OpenSSH_7.4, OpenSSL 1.0.2k

Finalmente, después de resolver muchos errores, llegué al punto en que SSHD abortó con el siguiente error:

Intento de escribir registros de inicio de sesión por usuario no root (abortando)

Verifiqué el código fuente para ver si es posible resolver el problema sin cambiar el código fuente. Mira el código aquí . Alguna parte del código que causa el aborto del programa:

#ifndef HAVE_CYGWIN
    if (geteuid() != 0) {
        logit("Attempt to write login records by non-root user (aborting)");
        return (1);
    }
#endif

Comprueba el privilegio del usuario (geteuid() != 0)y aquí causa el problema.

Mehrdad Nazmdar
fuente
1

Suponiendo lo que @magiclantern anotó anteriormente y asumiendo que no desea parchear, sshd¿funcionará algo como Dropbear para usted? Se utiliza en muchos dispositivos integrados que desean un servidor ssh con una huella más pequeña (y menos características / configuraciones).

nhed
fuente
1
dropbear -E -F -R -w -g -a -p 2222 -P ./dbearPID # hace el truco
dotbit
1

Aquí hay un sript bash de userland basado en la respuesta de Bo Jeanes que:

  • Crear directorio de trabajo en casa
  • generar claves de servidor en el directorio de trabajo
  • generar un archivo de configuración básico con un archivo pid ubicado en el directorio de trabajo
  • lanzar SSH daemon

mkdir ${HOME}/custom_ssh
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_dsa_key -N '' -t dsa
echo "Port 2222
HostKey ${HOME}/custom_ssh/ssh_host_rsa_key
HostKey ${HOME}/custom_ssh/ssh_host_dsa_key
AuthorizedKeysFile  .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
Subsystem   sftp    /usr/lib/ssh/sftp-server
PidFile ${HOME}/custom_ssh/sshd.pid" > ${HOME}/custom_ssh/sshd_config
/usr/bin/sshd -f ${HOME}/custom_ssh/sshd_config
echo "
--------
Process ID : ${HOME}/custom_ssh/sshd.pid
-------"
  • OpenSSH_7.9p1, OpenSSL 1.1.1a 20 Nov 2018
  • autenticación de pam (probado con el mismo usuario local y remoto)
inattendu
fuente
Todavía veo: "debug1: setgroups () falló: operación no permitida"
dotbit
Buena solución, pero debe hacer que los comandos se vean mejor. Feo.
MAChitgarha