Mi equipo está tratando de encontrar una solución para acceder y actualizar de forma remota varios dispositivos Linux detrás de un firewall en varias ubicaciones con sus propios firewalls. Tradicionalmente, visitábamos el sitio físico de la empresa y actualizamos los dispositivos con Ansible ejecutándose desde su red, o realizábamos cambios a través de RDP y acceso SSH individual. El reenvío de puertos no es una opción, ni siquiera para un bastión.
||REMOTE SERVER|| ===> ||LOCATION 1 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
(executing cmds) ===> ||LOCATION 2 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
===> ||LOCATION 3 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
...
===> ||LOCATION N FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
¿Cuál es la mejor práctica con AutoSSH o existe una alternativa que funcionaría mejor para mantener estos dispositivos? Tenemos dos soluciones hasta ahora.
Solución 1: AutoSSH para cada dispositivo:
-Establezca una conexión AutoSSH desde todos y cada uno de los dispositivos individuales en cada red (potencial de cientos por ubicación). Configure el acceso SSH para cada uno de esos dispositivos.
Host loc_1_device_1
HostName localhost
Port 6000
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_1_device_2
HostName localhost
Port 6001
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_1_device_3
HostName localhost
Port 6002
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_2_device_1
HostName localhost
Port 7000
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_2_device_2
HostName localhost
Port 7001
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Solución 2: AutoSSH solo para proxy/host de salto:
- Establecer una conexión AutoSSH desde un único proxy (posiblemente un secundario como conmutación por error) en cada una de las redes de nuestros clientes. Configure el acceso SSH para cada uno de esos dispositivos a un puerto en el servidor remoto.
Host location_1
HostName localhost
Port 6000
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host location_2
HostName localhost
Port 6001
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
A partir de ahí, la conexión parece bastante fácil con , o alguna configuración ansible para el comando proxy.ssh -t location_1 ssh [email protected]
Hice una prueba de concepto para la solución 2, ejecutando comandos de Ansible desde el servidor remoto, y parece funcionar bien, pero otros miembros del equipo se oponen a optar por la solución 1 para seguir siendo un inventario 1-1 de cada dispositivo (¿Cuál debería ser el objetivo de Ansible?). Lo que me preocupa de la solución 1 es que podría haber miles de dispositivos intentando mantener SSH inverso simultáneamente, lo que podría resultar en una sobrecarga innecesaria de la red. También parece una cantidad de trabajo innecesaria agregar y eliminar dispositivos de esa red.
¿Hay otra manera de abordar esto? ¿Estoy en el camino correcto o estoy loco por pensar que el resto del equipo está loco?
Respuesta1
Estoy usando su solución 1, pero con una asignación automática de números de puerto.
No necesito configurar cada dispositivo individualmente.
Esto se hace mediante un proceso de varias etapas. Si un dispositivo se conecta la primera vez, no sabe qué número de puerto debe usar. Entonces se conecta a través de ssh al servidor y envía su propia dirección MAC.
El servidor asigna un número de puerto libre, lo almacena y le indica el puerto al dispositivo. El dispositivo almacena el número de puerto para todas las conexiones futuras.
Luego, el dispositivo se vuelve a conectar con el número de puerto.
Todos los dispositivos usan la misma "clave privada", pero la clave solo se puede usar para construir un túnel hacia el servidor. Para conectar un dispositivo, mi clave pública se almacena en cada dispositivo.
En el servidor, el archivo Authorized_keys contiene un comando simple para esa clave (el script para la asignación de nuevas claves por parte de MAC). El túnel debe realizarse por-N
command="/home/tunnel/reverse_server/reverse_server.py",no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <PUBLIC-KEY-FOR-ALL-DEVICES>
En el servidor la GatewayPorts no
opción debe configurarse en /etc/sshd/sshd_config, para evitar el acceso a puertos externos.