Как изменить текст баннера 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