Я хотел бы написать плагин мониторинга, который проверяет различные хосты в моей сети, чтобы убедиться, что пароль или интерактивная аутентификация SSH не включены. То есть, Мне нужно написать код, который:
Методы с использованием кода python или bourne sh (с использованием ssh
) мне наиболее интересно, но другие языки, библиотеки или подсказки тоже приветствуются.
Я сейчас собираю один, однако вы можете заставить ssh выводить (в STDERR) поддерживаемые методы, используя параметр PreferredAuthentications. Это можно легко проанализировать с помощью grep/python/language по выбору.
HostA$ ssh -o PreferredAuthentications=none HostB
Permission denied (publickey,gssapi-with-mic).
HostA$ ssh -o PreferredAuthentications=none HostC
Permission denied (publickey,gssapi-with-mic,password,keyboard-interactive,hostbased).
Если вам нужно решение *nix , вы также можете подключиться к источникам OpenSSH. Если вам подходит Windows - вы также можете попробовать некоторые коммерческие библиотеки .NET, они намного удобнее, чем исходники OpenSSH :)
RFC 4252, который определяет аутентификацию в SSH, говорит следующее:
Методы аутентификации идентифицируются по их имени, как определено в [SSH-АРКА]. Метод "none" зарезервирован и НЕ ДОЛЖЕН быть указан как поддерживается. Однако он МОЖЕТ быть отправлен клиентом. Сервер ДОЛЖЕН всегда отклонять этот запрос, если только клиенту не должен быть предоставлен доступ без какой-либо аутентификации, и в этом случае сервер ДОЛЖЕН принять этот запрос. Основная цель отправки этого запроса — получить список поддерживаемых методов с сервера.
Таким образом, вы можете отправить запрос на нет аутентификации, чтобы получить список поддерживаемых. Однако сама аутентификация происходит после определенных действий более низкого уровня (обмен ключами — одно из них), поэтому вам может понадобиться написать часть протокола SSH в скрипте sh, что, вероятно, является нетривиальной задачей.