AutoSSH através de Firewall - Prática recomendada para muitos dispositivos na rede?

AutoSSH através de Firewall - Prática recomendada para muitos dispositivos na rede?

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 noopção deve ser configurada em /etc/sshd/sshd_config, para evitar acesso a portas externas.

informação relacionada