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í.
Respuestas:
La forma en que uso un host bastion está usando
ProxyCommand
y la-W
bandera como en este ejemplo: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.
-W
implica 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_keys
archivo 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_keys
privilegios del cliente pueden estar limitadas por el uso de las opcionescommand
,no-agent-forwarding
,no-pty
,no-user-rc
,no-X11-forwarding
, así como el usopermitopen
de 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.
fuente
ssh
comandos 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íassh
en el bastión, que abre una amplia gama de posibles vectores de ataque.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 sh
en 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.
fuente
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.
fuente
Haga que el sshd se ejecute como
.bashrc
propiedadroot:usergrp
pero 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
.fuente
.bashrc
comandos que quieres que se ejecuten entonces?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.
fuente