Tenemos el servidor B de bastión. Necesitamos SSH de A a B a C, usando una clave privada.
¿Cuál es la mejor opción?
Ponga la clave SSH privada en el servidor B. Leemos que es una mala idea hacerlo en un entorno de producción.
Desde aquí :
Nunca coloque sus claves privadas SSH en la instancia de bastión. En su lugar, utilice el reenvío de agente SSH para conectarse primero al bastión y de allí a otras instancias en subredes privadas. Esto le permite mantener su clave privada SSH solo en su computadora.
Utilice el reenvío de agentes SSH . Para configurar el reenvío de agentes, necesito permitir el reenvío de TCP. Al configurar el reenvío de agente, se crea un archivo de socket en el host de reenvío, que es el mecanismo por el cual la clave se puede reenviar al destino. En la configuración de Bastión en AWS:
Reenvío de TCP: establecer este valor en verdadero habilitará el reenvío de TCP (túnel SSH). Esto puede ser muy útil, pero también es un riesgo de seguridad, por lo que recomendamos mantener la configuración predeterminada (deshabilitada) a menos que sea necesario
También desde aquí :
SSH Agent Forwarding considerado perjudicial
¿Qué es mejor? ¿Qué pasa con la alternativa del segundo enlace: ProxyCommand , entiendo que ayuda con el problema del archivo de socket, pero todavía creo que tengo que habilitar el reenvío TCP, entonces, es lo suficientemente seguro?
ssh hostb
comando, para que pueda buscar hostb en la configuración local y saber que necesita conectarse a través de hosta. No podría hacer eso si pones la configuración en hosta ...Respuestas:
Use ProxyCommand o ProxyJump
Recomendaría usar
ProxyCommand
(o incluso mejor,ProxyJump
ya que la sintaxis es más fácil pero requiere openssh 7.3+, creo que en el lado del cliente), y no es necesario implementar una clave privada en el Bastión, todo permanece local.Ejemplo con ProxyJump
En su computadora cliente, escribe un archivo debajo
~/.ssh/config
con un contenido similar al siguiente:Luego,
ssh srvC
lo conectará a C a través de B (bastión) sin reenvío de agente ni desplegará la clave privada en el bastión.En el ejemplo anterior, "bastion" es un alias para su host Bastion y srvC es un alias para su servidor C. En el caso de
HostName
que necesite poner IP o un nombre de dominio completo para sus hosts. Para los usuarios, debe actualizar elUser
nombre de inicio de sesión correcto en el Bastión y el servidor C. Finalmente,IdentityFile
es opcional si utiliza un agente local (por ejemplo, KeeAgent o ssh-agent), pero si no se está ejecutando, también lo hará. trabajar y pedirle cada una de las frases clave.Implementar las claves públicas
Por supuesto, debe implementar las claves públicas en bastión y srvC. Puede usar (el signo $ es solo para ilustrar el mensaje, no lo escriba):
Nota: lo anterior solo funcionará si la autenticación de contraseña todavía está permitida. Después de la implementación anterior y de verificar que todo funciona según lo previsto, no debe permitir la autenticación de contraseña en los 2 servidores.
Ejemplo con ProxyCommand en lugar de ProxyJump
Si tiene una versión anterior de OpenSSH que no es compatible
ProxyJump
(en el lado del cliente), reemplace:por
Por lo que entendí, esto es similar.
fuente
Vi la respuesta sobre ProxyJump. Hablemos de ProxyCommand .
Pero espera, espera! Puedo escribirte cómo hackear el servidor que usa el reenvío de agentes, ¡sería mucho más fácil entender la diferencia!
Vamos a hackear
Para los pasos básicos: puedes leer mi publicación aquí
Los pasos básicos son los siguientes:
Cómo usar AgentForwarding
-Crea la configuración en ~ / .ssh / config
-Agregue su clave de autenticación a ssh-agent
-Conecte al bastión hos
-Conecte el servidor de aplicaciones desde el bastión
¡Hackear!
Puedes, bueno, hacerme la pregunta:
¿Es seguro mi servidor? Y la respuesta es bastante simple:
¿Por qué?
¿Y dónde está el problema?
¿Por qué?
¿Cómo hackear servidores si comprometiste el servidor bastion?
Seguir objetivo
En el directorio / tmp puede ver algo así:
Abramos el archivo temporal
Veamos las conexiones a este id de proceso.
resultado:
y quien esta conectado
resultado:
También podemos ver archivos de socket:
resultado:
¿ Y qué sucede cuando el cliente se conectará al servidor remoto? veamos:
Incluso podemos ver si el archivo de socket se usa usando netstat:
Robar información de socket y dirección IP
Ahora necesitamos robar la información del socket mientras la sesión del servidor bastión está abierta . Oh, también necesitamos la IP del servidor de destino , así que solo use netstat:
El paso final para usar el archivo de socket reenviado
Verifique si la llave está cargada .
El resultado debería ser algo así :
El servidor está pirateado, ¿cómo solucionar el problema de seguridad?
Comando proxy
Para operaciones básicas: cómo transferir archivos a través de los servidores (de cliente a servidor, de servidor a cliente), puede leer mi publicación aquí
Conclusión
Más información, mira mi blog . Además, tengo algunas capturas de pantalla, por lo que puede ser útil para usted.
fuente
channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed.
. ¿Tienes idea de por qué? En el registro seguro veo:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
Simplemente use el reenvío de agentes SSH como la mayoría de los demás.
Ventaja: no hay claves almacenadas en el bastión que puedan ser mal utilizadas.
Espero que ayude :)
fuente