Назад | Перейти на главную страницу

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

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

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

telnet my-remote-host 22

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

SSH-2.0-OpenSSH_4.3

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

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

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

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

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

Вы можете / должны использовать 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

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

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

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