Acceso de túnel ssh solo

31

¿Es posible configurar ssh (en linux) para permitir el acceso solo a túneles? Es decir, ¿el usuario puede configurar túneles pero no puede obtener un shell / acceder a los archivos?

Segundo
fuente

Respuestas:

42

Sí, solo utilícelo /bin/falsecomo shell e indique al usuario que inicie el proceso de túnel SSH sin ejecutar ningún comando remoto (es decir, el -Nindicador de OpenSSH):

ssh -N -L 1234:target-host:5678 ssh-host
conde
fuente
Um, si el usuario no usa -N, tiene acceso de shell. Esto realmente no resuelve el problema y es peligroso.
mlissner
12
@mlissner: No, si tiene un /bin/falseshell, no tendrá acceso al shell, ya que cada sesión de inicio de sesión finalizará de inmediato.
Sven
10

En el archivo .ssh / optional_keys del usuario, coloque algo como lo siguiente:

permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...

Entonces, básicamente, los controles estarían frente a la clave pública ssh del usuario, separados por un espacio. En el ejemplo, las conexiones que usan la clave pública específica podrán reenviar puertos SSH solo al servidor MySQL de 192.168.1.10 y al servidor web de 10.0.0.16, y no se les asignará un shell (no pty). Está preguntando específicamente sobre la opción "no pty", pero las otras también pueden ser útiles si se supone que el usuario solo debe hacer un túnel a servidores específicos.

Mire la página de manual de sshd para más opciones para el archivo autorizado_claves .

Tenga en cuenta que la experiencia del usuario puede parecer un poco extraña: cuando ingresa, parecerá que la sesión se está bloqueando (ya que no está obteniendo un pie). Está bien. Si el usuario ha especificado el reenvío de puertos con, por ejemplo, "-L3306: 192.168.1.10: 3306", el reenvío de puertos seguirá vigente.

En cualquier caso, pruébalo.

cjc
fuente
66
Este es un consejo peligroso ; no-ptyno impide el acceso al shell, simplemente no le da pie al shell. No muestra el mensaje (es decir, "parece que se cuelga"), pero aún puede dar comandos muy bien. Necesita la command="..."opción .ssh/authorized_keyssi desea restringir el acceso de shell desde allí.
Aleksi Torhamo 01 de
@AleksiTorhamo es correcto, pero esto es un comienzo; también debe establecer el shell en / usr / sbin / nologin o / bin / false en / etc / passwd para restringir completamente el shell. Edité la entrada anterior para reflejar eso, junto con el consejo de Aleksi.
Jamieson Becker
4

Proporcione al usuario un shell que solo le permita cerrar sesión, como /bin/press_to_exit.sh

#! / bin / bash
leer -n 1 -p "Presione cualquier tecla para salir"

De esta manera, puede permanecer conectado todo el tiempo que quiera, con los túneles activos, pero sin ejecutar ningún comando. Ctrl-ccierra la conexión

Campanita
fuente
3
Creo que, al menos en teoría, el usuario podrá presionar CTRL + C en el momento correcto (entre las líneas 1 y 2) y terminar con un shell de bash completo.
andreas-h
2

Asigne un shell que no permita que el usuario inicie sesión.

p.ej

#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0

evitaría que reciban un aviso de shell y les daría un tiempo de espera de 60 segundos; si no hay una conexión activa durante 60 segundos, saldrá y, por lo tanto, los desconectará por completo (aumente el número según los requisitos).

Tampoco pueden ejecutar un comando remoto, porque ese shell no los deja.

jrg
fuente
44
La mayoría de las instalaciones de Linux ya vienen con algo para eso. / sbin / nologin, o / bin / false o similar.
Rory
1
¿Qué haría Ctrl-C en el ejemplo anterior?
Arjan
Arjan: Dado que el script se usa como shell, Ctrl-C tendría el mismo efecto que " logout" en uno normal.
Grawity
2
De hecho, me gusta la respuesta de Earl, con la opción "-N", pero si desea darle a su usuario un mensaje útil, amigable e informativo, y evitar que dejen conexiones SSH por todas partes, entonces un script personalizado es agradable y claro sobre Lo que está haciendo.
jrg
2
@jrg Esta discusión es antigua y es posible que haya cambiado de opinión :) pero en mi humilde opinión, es peligroso salir con scripts de shell hechos a mano. Ya existe /sbin/nologin, que puede personalizar con un mensaje fácil de usar /etc/nologin.txt.
dr01
0

Mi solución es proporcionar al usuario que solo puede estar haciendo un túnel, sin un shell interactivo , para configurar ese shell en / etc / passwd a / usr / bin / tunnel_shell .

Simplemente cree el archivo ejecutable / usr / bin / tunnel_shell con un bucle infinito .

Además, utilice la opción AllowGroupsy Match Group.

Completamente explicado aquí: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Daniel W.
fuente
2
El usuario podría salir del ejecutable de alguna manera y escapar de un shell. ¿Confía perfectamente en que su ejecutable no permitirá hacer esto?
dr01
2
@ dr01 Para ser honesto, no estoy seguro de si esto es 100% seguro. Supongo que cuando sales del ejecutable, la sesión SSH también se cierra. Investigaré esto más y podría comentar nuevamente aquí.
Daniel