Tengo un servidor que ejecuta Ubuntu y el demonio OpenSSH. Llamémoslo S1.
Uso este servidor desde máquinas cliente (llamemos a una de ellas C1) para hacer un túnel inverso SSH mediante el reenvío de puertos remotos, por ejemplo:
ssh -R 1234:localhost:23 login@S1
En S1, uso el archivo sshd_config predeterminado. Por lo que puedo ver, cualquiera que tenga las credenciales correctas {login, pwd} en S1 puede iniciar sesión en S1 y realizar el reenvío de puertos remotos y el reenvío de puertos locales. Dichas credenciales podrían ser un certificado en el futuro, por lo que, según tengo entendido, cualquiera que tome el certificado puede iniciar sesión en S1 desde cualquier otro lugar (no necesariamente C1) y, por lo tanto, crear reenvíos de puertos locales.
Para mí, permitir el reenvío de puertos locales es demasiado peligroso, ya que permite crear algún tipo de proxy público. Estoy buscando una manera de desactivar solo los reenvíos.
Intenté lo siguiente, pero esto deshabilita el reenvío local y remoto:
AllowTcpForwarding No
También probé lo siguiente, esto solo permitirá -L a SX: 1. Es mejor que nada, pero aún no es lo que necesito, que es una opción de "ninguno".
PermitOpen SX:1
Así que me pregunto si hay una manera, para que pueda prohibir a todos los reenvíos de puertos locales escribir algo como:
PermitOpen none:none
¿Es la siguiente una buena idea?
PermitOpen localhost:1
Respuestas:
cualquier persona con credenciales de inicio de sesión puede mostrar su propia instancia de sshd, que se ejecuta en un puerto aleatorio y permitir lo que quiera, incluidos los reenvíos locales -L:
Si no confía en los usuarios para hacer algo con su máquina, no debe permitirles iniciar sesión en primer lugar.
(por cierto, el indicador -D también es "problemático de proxy")
fuente
command="/sbin/nologin"
. Esto debería evitar que ejecuten comandos en el servidor.ssh
se puede usar para conectarse a cuentas que tienen restricciones de inicio de sesión severamente restringidas que no lo permiten. El reenvío de puertos es un agujero de seguridad en dichos depósitos restringidos. Además de ejecutar un comando permitido, el usuario puede crear túneles.sshd_config
página de manual: tenga en cuenta que deshabilitar el reenvío TCP no mejora la seguridad a menos que a los usuarios también se les niegue el acceso al shell , ya que siempre pueden instalar sus propios reenviadores. (El énfasis es mío).Otra solución sería permitir solo el reenvío de puertos a usuarios específicos:
De SSH: la guía definitiva
El reenvío de puertos se puede habilitar o deshabilitar globalmente en sshd. Esto se hace con la palabra clave de configuración del servidor AllowTcpForwarding en / etc / sshd_config. La palabra clave puede tener el valor yes (el valor predeterminado, habilita el reenvío) o no (deshabilita el reenvío):
Además, SSH2 tiene las siguientes opciones:
La sintaxis de estos es la misma que para las opciones AllowUsers y AllowGroups. [Sección 5.5.2.1, "Control de acceso a la cuenta"] Especifican una lista de usuarios o grupos que pueden usar el reenvío de puertos; el servidor se niega a cumplir con las solicitudes de reenvío de puertos para cualquier otra persona. Tenga en cuenta que se refieren a la cuenta de destino de la sesión SSH, no al nombre de usuario del cliente (que a menudo no se conoce).
...
Es importante darse cuenta de que las directivas de esta sección en realidad no impiden el reenvío de puertos, a menos que también desactive los inicios de sesión interactivos y restrinja qué programas se pueden ejecutar en el lado remoto. De lo contrario, los usuarios expertos simplemente pueden ejecutar su propia aplicación de reenvío de puertos a través de la sesión SSH. Esta configuración por sí sola puede ser un elemento disuasorio suficiente en una comunidad no técnica, pero no detendrá a alguien que sepa lo que está haciendo.
fuente
AllowTcpForwardingForUsers
revela que está configurado en unsshd2_config
, que se utiliza en algunos programas comerciales. Vea una de las respuestas a: superuser.com/questions/384643/…Match
bloques en la configuración. PuedeMatch
en usuarios y grupos, y adjuntar elAllowTcpForwarding
interior.Ahora hay una opción para permitir solo el reenvío local / remoto.
AllowTcpForwarding Especifica si se permite el reenvío TCP. Las opciones disponibles son "sí" o "todos" para permitir el reenvío de TCP, "no" para evitar todo el reenvío de TCP, "local" para permitir el reenvío local (desde la perspectiva de ssh (1)) solamente o "remoto" para permitir el control remoto solo reenvío . El valor predeterminado es "sí". Tenga en cuenta que deshabilitar el reenvío TCP no mejora la seguridad a menos que a los usuarios también se les niegue el acceso al shell, ya que siempre pueden instalar sus propios reenviadores.
Entonces, como ya se dijo, también debe configurar el shell para nologin.
fuente
Mi solución a este problema fue agregar: PermitOpen fo.local: 80 en la sección principal de sshd_config.
Esto simplemente niega cualquier solicitud de reenvío local además de fo.local: 80.
fuente
Si te entiendo correctamente, tus usuarios tienen acceso completo al shell, pero no quieres que puedan abrir conexiones hacia el resto de la red.
El "reenvío de puertos locales" permitido por SSH es solo una de las formas posibles de hacerlo. Otros incluyen el lanzamiento de una instancia de
socat
,netcat
o cualquier otro número de herramientas.La mejor manera de controlar las conexiones salientes y entrantes en Linux es Netfilter, también conocido como IPTables.
Tiene un módulo especial llamado owner (
ipt_owner
) que le permite hacer coincidir varias características del creador de paquetes, para paquetes generados localmente. Es válido en las cadenasOUTPUT
yPOSTROUTING
.Puede usarlo para denegar paquetes salientes generados por ciertos grupos de usuarios, lo que deshabilita cualquier tipo de reenvío de puertos, no solo la
-L
opción de SSH.fuente