Minha equipe está tentando encontrar uma solução para acessar e atualizar remotamente vários dispositivos Linux atrás de um firewall em vários locais com seus próprios firewalls. Tradicionalmente, visitaríamos o site físico da empresa e atualizaríamos os dispositivos com o Ansible em execução na rede ou faríamos alterações via RDP e acesso SSH individual. O encaminhamento de porta não é uma opção, nem mesmo para um bastião.
||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]
Qual é a melhor prática com AutoSSH ou existe uma alternativa que funcionaria melhor para manter esses dispositivos? Temos duas soluções até agora.
Solução 1 – AutoSSH para cada dispositivo:
-Estabeleça conexão AutoSSH de cada dispositivo individual em cada rede (potencial para centenas por local). Configure o acesso SSH para cada um desses 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
Solução 2-AutoSSH apenas para proxy/host de salto:
- Estabeleça conexão AutoSSH a partir de um único proxy (possivelmente um secundário como failover) em cada uma das redes de nossos clientes. Configure o acesso SSH para cada um desses dispositivos a uma porta no 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 daí, a conexão parece fácil com ou alguma configuração ansible para comando proxy.ssh -t location_1 ssh [email protected]
Fiz uma prova de conceito para a solução 2, executando comandos Ansible no servidor remoto, e parece funcionar bem, mas há resistência de outros membros da equipe para optar pela solução 1 e permanecer um inventário 1-1 de cada dispositivo (qual deveria ser o objetivo do Ansible?). O que me preocupa com a solução 1 é que pode haver milhares de dispositivos tentando manter o SSH reverso simultaneamente, o que pode resultar em sobrecarga desnecessária da rede. Também parece uma quantidade desnecessária de trabalho adicionar e remover dispositivos dessa rede.
Existe outra maneira de abordar isso? Estou no caminho certo ou estou louco por pensar que o resto da equipe é louco?
Responder1
Estou usando sua solução 1, mas com alocação automática de números de porta.
Não preciso configurar cada dispositivo individualmente.
Isso é feito por um processo de vários estágios. Se um dispositivo se conectar pela primeira vez, ele não saberá qual número de porta deverá usar. Então ele se conecta via ssh ao servidor, enviando seu próprio endereço MAC.
O servidor aloca um número de porta livre, armazena-o e informa a porta ao dispositivo. O dispositivo armazena o número da porta para todas as conexões futuras.
Em seguida, o dispositivo se reconecta ao número da porta.
Todos os dispositivos usam a mesma “chave privada”, mas a chave só pode ser usada para construir um túnel para o servidor. Para conectar um dispositivo, minha chave pública é armazenada em cada dispositivo.
No servidor o arquivoauthorized_keys contém um comando simples para aquela chave (o script para alocação de novas chaves pelos MACs). O túnel deve ser feito através-N
command="/home/tunnel/reverse_server/reverse_server.py",no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <PUBLIC-KEY-FOR-ALL-DEVICES>
No servidor a GatewayPorts no
opção deve ser configurada em /etc/sshd/sshd_config, para evitar acesso a portas externas.