Как изменить текст баннера OpenSSH при тестировании порта через telnet

Я развертываю скрипт, который выполняется на разных клиентах за брандмауэрами, которые я не контролирую. Сценарий пытается войти через SSH-клиент на удаленный сервер, которым я управляю (сценарий поставляется с предварительно загруженным закрытым ключом для аутентификации). Некоторые брандмауэры в некоторых центрах обработки данных перенаправляют запросы ВСЕХ ВЫХОДНЫХ портов 22 на другой сервер (кажется, что системные администраторы на различных объектах делали это для своих собственных целей).

В этих случаях происходит сбой сценария (из-за сбоя входа клиента ssh). В скрипте есть средство диагностики, которое проверяет соединения пользователя. Чтобы определить, доступен ли мой удаленный сервер с их рабочей станции через порт 22, я хочу запустить команду

telnet my-remote-host 22

Из моего сценария и проверить ответ. Мой целевой сервер отвечает:

SSH-2.0-OpenSSH_4.3

Мой локальный сервер разработки отвечает:

SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4

ПРИМЕЧАНИЕ. Это ответы telnet на порту 22, а не текст баннера OpenSSH для моего сервера (который в таких ситуациях недоступен)

Как мне контролировать этот текст? - Таким образом, я могу вставить токен, который идентифицирует мой собственный сервер как проверяемый в этой ситуации. На серверах центра обработки данных, принимающих запросы порта 22, возможно, работает та же версия OpenSSH, что и на моем удаленном сервере.

(В настоящее время моя диагностика просто сообщает о неудачном входе в систему, но есть и другие причины, по которым это может произойти - я ищу более детальную диагностику, которая может проверить, действительно ли мой сервер доступен на порту 22, прежде чем я попытаюсь войти в систему).)

3 ответа

Решение

Извините, я боюсь, что единственный способ изменить этот текст - это изменить исходный код и скомпилировать ssh вручную.

Вы делаете это неправильно! Единственный способ определить, достигли ли вы "хорошего" сервера, - это проверить отпечаток его ключа. Взгляните на справочную страницу ssh_config (5). Параметр, который вы ищете, должен быть 'StrictHostKeyChecking'

И, кстати, не делайте глупостей с этим баннером. Его содержимое определено в спецификации протокола, и его изменение может помешать вашим клиентам подключиться.

Вы могли / должны использовать ssh-keyscan собрать и сравнить открытый ключ вашего хоста. Я полагаю, что подделать гораздо сложнее, чем сменить баннер (что, как вы можете видеть из других ответов, приводит к тому, что людям все равно становится жарко!). Если вы получаете ключ, и он соответствует тому, что, как вы знаете, ключ должен быть, то хост подключен и прослушивает порт 22 без необходимости входа в систему. Это избавляет вас от необходимости перекомпилировать ваши пакеты ssh каждый раз, когда выходит новый выпуск.

    $ ssh-keyscan localhost
# localhost SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5qXqsZ4S/e4ANfQraXbJx9muKgdrPWrwI/SrIbnZLso9Poszmt3+NrBbTYkuZR92a6BL2gDXCdG0ugsY01u6xItKnnB0XZLYkSqqqwoGubqWbGfC5Zxsosne9cCevVNl3aomSNf8ctw+rEdBfrWjom6wu0CTy1umbDkT186l9LDoefzeOqSpPyIQBHZcDPeeY0B8vPyTCsC5ly/hwoQb/3nT5QMRaawlHNKJMgDE3avTUsPdtVjG2V55rpJpIDeBid7icMwxbGqTAS9T3hW111BdGGjaXspk1t23FnZOUQTzfI4kXj3SxUjSHIx6czX9SZ9NMa/7VewtJPVxRuPLGw==

Ключ будет отличаться для каждого хоста.

Так что-то вроде этого заставит шарик катиться.

key=$(ssh-keyscan localhost)

known_key="localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5qXqsZ4S/e4ANfQraXbJx9muKgdrPWrwI/SrIbnZLso9Poszmt3+NrBbTYkuZR92a6BL2gDXCdG0ugsY01u6xItKnnB0XZLYkSqqqwoGubqWbGfC5Zxsosne9cCevVNl3aomSNf8ctw+rEdBfrWjom6wu0CTy1umbDkT186l9LDoegzeOqSpPyIQBHZcDPeeY0B8vPyTCsC5ly/hwoQb/3nT5QMRaawlHNKJMgDE3avTUsPdtVjG2V55rpJpIDeBid7icMwxbGqTAS9T3hW111BdGGjaXspk1t23FnZOUQTzfI4kXj3SxUjSHIx6czX9SZ9NMa/7VewtJPVxRuPLGw=="

echo "($key)"
echo "-------"
echo "($known_key)"

if [[ "$key" = $known_key ]]; then
   echo "GOOD host key matches known key"
else
   echo "ERROR host key does not match known key"
fi
Другие вопросы по тегам