Respuestas:
Sí, solo utilícelo /bin/false
como shell e indique al usuario que inicie el proceso de túnel SSH sin ejecutar ningún comando remoto (es decir, el -N
indicador de OpenSSH):
ssh -N -L 1234:target-host:5678 ssh-host
/bin/false
shell, no tendrá acceso al shell, ya que cada sesión de inicio de sesión finalizará de inmediato.
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.
no-pty
no 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_keys
si desea restringir el acceso de shell desde allí.
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-c
cierra la conexión
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.
logout
" en uno normal.
/sbin/nologin
, que puede personalizar con un mensaje fácil de usar /etc/nologin.txt
.
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 AllowGroups
y Match Group
.
Completamente explicado aquí: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
-N
, tiene acceso de shell. Esto realmente no resuelve el problema y es peligroso.