AutoSSH через брандмауэр — наилучшая практика для большого количества устройств в сети?

AutoSSH через брандмауэр — наилучшая практика для большого количества устройств в сети?

Моя команда пытается найти решение для удаленного доступа и обновления нескольких устройств Linux за брандмауэром в нескольких местах с их собственными брандмауэрами. Традиционно мы бы посетили физическое место компании и обновили устройства с Ansible, запущенным из их сети, или внесли бы изменения через RDP и индивидуальный доступ SSH. Переадресация портов не является вариантом, даже для бастиона.

||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]

Что является лучшим вариантом для AutoSSH или есть ли альтернатива, которая будет работать лучше для обслуживания этих устройств? На данный момент у нас есть два решения.

Решение 1 — AutoSSH для каждого устройства:

-Установите AutoSSH-подключение с каждого отдельного устройства в каждой сети (потенциально сотни на одно местоположение). Настройте SSH-доступ для каждого из этих устройств.

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

Решение 2 — AutoSSH только для прокси/хоста перехода:

  • Установить AutoSSH-подключение с одного прокси-сервера (возможно, вторичного в качестве отказоустойчивого) в каждой из сетей наших клиентов. Настроить SSH-доступ для каждого из этих устройств к порту на удаленном сервере.
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

Оттуда подключение кажется достаточно простым с помощью , или какой-либо конфигурации ansible для команды proxy.ssh -t location_1 ssh [email protected]

Я выполнил проверку концепции для решения 2, запустив команды Ansible с удаленного сервера, и, похоже, это работает хорошо, но есть сопротивление со стороны других членов команды, чтобы использовать решение 1, чтобы оставаться инвентаризацией 1-1 для каждого устройства (в чем, собственно, и должен быть весь смысл Ansible?). Что меня беспокоит в решении 1, так это то, что могут быть тысячи устройств, пытающихся одновременно поддерживать обратный SSH, что может привести к ненужным сетевым накладным расходам. Также это кажется ненужным объемом работы по добавлению и удалению устройств из этой сети.

Есть ли другой способ подойти к этому? Я на правильном пути или я сошел с ума, раз думаю, что вся остальная команда сумасшедшая?

решение1

Я использую ваше решение 1, но с автоматическим распределением номеров портов.
Мне не нужно настраивать каждое устройство по отдельности.

Это делается многоступенчатым процессом. Если устройство подключается в первый раз, оно не знает, какой номер порта ему следует использовать. Поэтому оно подключается через ssh к серверу, отправляя свой собственный MAC-адрес.
Сервер выделяет свободный номер порта, сохраняет его и сообщает порт устройству. Устройство сохраняет номер порта для всех будущих подключений.

Затем устройство повторно подключается к этому номеру порта.

Все устройства используют один и тот же "закрытый ключ", но ключ может быть использован только для построения туннеля к серверу. Для подключения устройства мой открытый ключ хранится на каждом устройстве.

На сервере файл authorized_keys содержит простую команду для этого ключа (скрипт для выделения новых ключей по MAC). Туннель должен быть сделан через-N

command="/home/tunnel/reverse_server/reverse_server.py",no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <PUBLIC-KEY-FOR-ALL-DEVICES>

На сервере эта GatewayPorts noопция должна быть настроена в /etc/sshd/sshd_config, чтобы избежать доступа к внешнему порту.

Связанный контент