Tenemos un servidor público que acepta conexiones SSH de múltiples clientes detrás de firewalls.
Cada uno de estos clientes crea un túnel SSH inverso mediante el ssh -R
comando de sus servidores web en el puerto 80 a nuestro servidor público.
El puerto de destino (en el lado del cliente) del túnel SSH inverso es 80 y el puerto de origen (en el lado del servidor público) depende del usuario. Estamos planeando mantener un mapa de direcciones de puerto para cada usuario.
Por ejemplo, el cliente A haría un túnel en su servidor web en el puerto 80 a nuestro puerto 8000; cliente B de 80 a 8001; cliente C de 80 a 8002.
Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver
Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver
Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver
Básicamente, lo que estamos tratando de hacer es vincular a cada usuario con un puerto y no permitirles hacer un túnel a ningún otro puerto.
Si estuviéramos usando la función de tunelización directa de SSH con ssh -L
, podríamos permitir qué puerto se tunelizaría usando la permitopen=host:port
configuración. Sin embargo, no hay equivalente para el túnel SSH inverso.
¿Hay alguna forma de restringir los puertos de túnel inverso por usuario?
fuente
Respuestas:
Dado que ha colocado no permitir en negrita, supongo que desea algún tipo de rechazo en tiempo de ejecución en el lado del cliente SSH que impide el enlace del puerto. Entonces, he cavado el código fuente para ti:
serverloop.c:
Desafortunadamente, como puede ver, no hay muchas condiciones que parezcan evitar el reenvío de puertos aparte de las estándar.
Estaba a punto de recomendar la misma sugerencia para usar
mod_owner
dentroiptables
, pero Jeff me ha convencido.Su solución más limpia sería simplemente modificar este archivo (por ejemplo, puede usarlo
pw->pw_uid
para obtener la conexión del usuario del usuario y asignarlo al puerto correcto) y recompilar su servidor SSH, pero eso dependería de qué tan cómodo se sienta con esto. .fuente
Mi sugerencia es usar SELinux para esto. Tendrá que configurar perfiles de usuario que permitan qué puertos se abrirán. El
sshd
proceso se bifurca y cae a los privilegios del usuario antes de abrir un puerto para reenviar, por lo que todo lo aplicado a los procesos del usuario se aplicarásshd
. Tenga en cuenta que deberá restringir todos los procesos del usuario, ya que una vez podría utilizarnetcat
para reenviar otro puerto. Intentaré resolver la sintaxis adecuada para usted más tarde (o cualquier otro usuario puede editarlo).Alternativamente, puede intentar usar
iptables
.Sin embargo, eso no les impedirá abrir el puerto y negar a otro usuario.
fuente