¿Qué tan seguro es SSH ForceCommand en un host de salto?

8

Tengo la siguiente configuración en mi red:

Internet <--> Bastion <--> Local Network

Tengo varios usuarios y cada usuario está asignado a una máquina específica. O en otras palabras: cada usuario debe tener acceso solo a uno de esos servidores. Por ejemplo: Usuario1 -> Máquina1, Usuario2 -> Máquina2 y así sucesivamente.

Esos usuarios se conectarán desde el exterior de mi red y he considerado muchas opciones sobre cómo reenviar sus conexiones a través de mi servidor bastion a mi red.

Finalmente, opté por Match Blocks y forcecommand.

Entonces, mi / etc / ssh / sshd_config en bastion se ve así:

Match User User1
        ForceCommand ssh User1@Machine1 $SSH_ORIGINAL_COMMAND

El Usuario1 se conecta al host del bastión que establece automáticamente una conexión con la Máquina1.

Por lo que entendí ForceCommand, Usuario1 no tendrá ningún acceso real al host del bastión, porque todas sus operaciones serán manejadas primero por el bloque de coincidencias, por lo tanto redirigido a Máquina1. Sin embargo, ¿es esto realmente cierto? ¿Ya es suficiente para ser una configuración segura? El usuario está encarcelado en Machine1 de todos modos, por lo que no tendrá muchas posibilidades allí.

Dr.Elch
fuente
2
Recuerde obtener IPv6, por lo que no tendrá más necesidad de saltar cuadros.
Michael Hampton

Respuestas:

6

La forma en que uso un host bastion está usando ProxyCommandy la -Wbandera como en este ejemplo:

ssh -o ProxyCommand='ssh -W %h:%p user@bastion' user@machine

Utilizo este enfoque por razones de seguridad. La comunicación entre el cliente y la máquina de destino está encriptada y autenticada de extremo a extremo, lo que significa que permanece segura incluso si el bastión está comprometido. Un host de bastión comprometido no proporcionaría menos seguridad que el uso de ssh de extremo a extremo sin un bastión.

También elimina la necesidad de utilizar cualquier reenvío de agentes. El cliente puede usar la autenticación basada en clave primero para acceder al bastión y luego nuevamente para acceder al host de destino sin que ninguno de los dos tenga una conexión de agente que pueda usarse para abusar de la clave privada presente en el cliente.

También limita el código del que depende el host del bastión. No necesito ejecutar ningún comando en absoluto en el bastión. -Wimplica el indicador de no comando, así como el reenvío de un solo puerto, este reenvío de puertos es todo lo que el host del bastión necesita permitir.

Con este enfoque en mente, mi recomendación sería bloquear el host del bastión tanto como sea posible permitiendo que solo se usen comandos de la estructura anterior.

El ~/.ssh/authorized_keysarchivo en el bastión podría ser propiedad de root (al igual que todos los directorios en la ruta desde la raíz del sistema de archivos), esto reduce el riesgo de que pueda modificarse incluso si alguien logra entrar como usuario no privilegiado en el Bastión de acogida.

En authorized_keysprivilegios del cliente pueden estar limitadas por el uso de las opciones command, no-agent-forwarding, no-pty, no-user-rc, no-X11-forwarding, así como el uso permitopende reenvíos de puertos límite para que sólo permita el acceso al puerto 22 en el host que este usuario se le permite el acceso a.

En principio, este enfoque sería seguro incluso si varios usuarios comparten un solo nombre de usuario en el bastión. Pero obtienes un poco más de separación al usar nombres de usuario separados en el bastión.

kasperd
fuente
Parece que estás invocando ssh binary en el bastión mismo. En este caso, si el bastión está comprometido, el atacante puede reemplazar este binario ssh con uno que volcaría sus comunicaciones. Dado que no está utilizando la ruta en su línea de comandos (como / usr / bin / ssh), el atacante podría hacerlo incluso sin tener acceso a la raíz en el bastión, colocándolo en el directorio de inicio y cambiando la RUTA (o usando un alias ssh) Solo mis 2 centavos.
George Y.
1
@GeorgeY. Está usted equivocado. Ambos sshcomandos se ejecutan en el cliente. Y ese es exactamente el punto de hacerlo de la manera que sugiero. El enfoque mencionado en la pregunta se ejecutaría sshen el bastión, que abre una amplia gama de posibles vectores de ataque.
kasperd
2

Puede eludir fácilmente ForceCommand ya que se activa cuando se inicia su shell. Esto esencialmente significa que su archivo rc de shell se procesa primero y luego ForceCommand si permite que llegue allí. Simple exec shen su archivo rc de shell generará otro shell y mantendrá ForceCommand esperando hasta que salga de este shell.

Así que el resultado final; si el usuario puede editar de alguna manera su shell rc (digamos .bashrc) a través de ftp, sftp, scp o de alguna otra manera, entonces ForceCommand no es realmente algo en lo que confiar.

Hrvoje Špoljar
fuente
Ok, lo intentaré. Ninguno de esos usuarios tiene acceso al host del bastión para modificar el archivo. Solo tienen acceso al host de destino donde pueden alterar el .bashrc. Pero espero que te entienda bien, ¿te relacionas con el anfitrión del bastión?
Dr.Elch
1
Eso es solo un problema si el usuario puede iniciar sesión en el sistema para cambiar el archivo bashrc. Si estas cuentas no están destinadas a usarse normalmente, entonces pueden ser propiedad de root, con el directorio y casi todos los archivos propiedad de root. Verifique las reglas sobre la propiedad de los archivos .ssh, pero ciertamente cosas como .bashrc no necesitan ser grabables.
mc0e
Sí @ Dr.Elch de hecho, me refería a la seguridad en el host del bastión. También puedes considerar; chattr + i para configurar shell rc como inmutable y deshabilitar a los usuarios para que cambien el shell por sí mismos como opción.
Hrvoje Špoljar
1

Me imagino que eso está bien la mayor parte del tiempo, pero el problema con la seguridad son las cosas en las que nadie ha pensado todavía. No hay garantías

Como, por ejemplo, durante mucho tiempo, nadie había pensado demasiado en la forma en que se podían crear funciones a partir de variables de entorno en bash, pero recientemente la gente se dio cuenta de que podía subvertirse, y uno de los efectos de eso fue que ForceCommand podía evitarse (en como se implementó en el archivo Authorized_keys) si el shell de los usuarios era bash. Bash se solucionó y, con suerte, su versión está actualizada, pero suceden cosas como esta.

No estoy completamente seguro de si definir ForceCommand es efectivamente lo mismo que definir esos comandos en los archivos autorizado_claves. No he mirado tan de cerca.

mc0e
fuente
0

Haga que el sshd se ejecute como .bashrcpropiedad root:usergrppero que aún pueda leerlo cuando el usuario inicie sesión. Establezca permisos / propietario en $ HOME y no permita que el usuario cree nuevos archivos. De esta forma, root controla el contenido de .bashrc, permitiéndole hacer lo que necesita, pero el usuario en sí no puede cambiar esa configuración o permisos en archivos / directorios que indirectamente les permitirían cambiar el contenido de .bashrc.

Marcin
fuente
¿Qué tal no asignar ningún directorio de inicio a ese usuario en el servidor bastión?
Dr.Elch
¿Dónde vas a almacenar los .bashrccomandos que quieres que se ejecuten entonces?
Marcin
En el servidor bastion, el comando de fuerza que reenvía la conexión al host real se define en sshd_config. Por lo tanto, no necesito especificar más comandos en ese servidor bastión, ¿verdad?
Dr.Elch
0

Tengo otra idea Para cada usuario en el servidor bastion, puede definir su shell en / etc / passwd para que sea un script bash que simplemente ejecute ssh user1 @ machine1, user2 @ machine2, etc. De esta manera se asegurará de que no tengan ninguna validez. shell en el servidor y que simplemente se conectan a la máquina a la que deberían conectarse.

Mugurel
fuente
¿Has probado esto? Se me ocurrió esta idea y me pregunto qué tan bien funciona.
William Pietri