Я развертываю сценарий, который запускается на различных клиентах за межсетевыми экранами, которые я не контролирую. Сценарий пытается выполнить вход клиента 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 вручную.