Как я могу программно определить доступные типы аутентификации ssh?

Я хотел бы написать плагин для мониторинга, который проверяет различные хосты в моей сети, чтобы убедиться, что пароль или интерактивная аутентификация SSH не включены. То есть мне нужно написать код, который:

  1. Подключается к порту SSH.
  2. Перечисляет доступные методы проверки подлинности.
  3. Проверяет, что возможна только аутентификация на основе ключа.

Методы, использующие код python или bournesh (с использованием ssh), мне наиболее интересны, но другие языки, библиотеки или подсказки также приветствуются.


person Stef    schedule 27.08.2010    source источник


Ответы (4)


В настоящее время я создаю его сам, однако вы можете заставить 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).
person Eadwacer    schedule 31.08.2010
comment
Красиво и просто. Спасибо. Был бы заинтересован в вашем коде, если он окажется с открытым исходным кодом... - person Stef; 01.09.2010
comment
К сожалению, этот конкретный блок кода не может быть открытым. Извиняюсь. Вот почему я хотел поделиться первоначальными мыслями, прежде чем мне нужно будет перестать говорить об этом. - person Eadwacer; 01.09.2010

RFC 4252, который определяет аутентификацию в SSH, говорит следующее:

Методы аутентификации идентифицируются по их имени, как определено в [SSH-ARCH]. Метод «none» зарезервирован и НЕ ДОЛЖЕН быть указан как поддерживаемый. Однако он МОЖЕТ быть отправлен клиентом. Сервер ДОЛЖЕН всегда отклонять этот запрос, если только клиенту не будет предоставлен доступ без какой-либо аутентификации, и в этом случае сервер ДОЛЖЕН принять этот запрос. Основная цель отправки этого запроса — получить список поддерживаемых методов с сервера.

Таким образом, вы можете отправить запрос на аутентификацию нет, чтобы получить список поддерживаемых. Однако сама аутентификация происходит после определенных действий более низкого уровня (обмен ключами — одно из них), поэтому вам может понадобиться написать часть протокола SSH в скрипте sh, что, вероятно, является нетривиальной задачей.

person Eugene Mayevski 'Callback    schedule 27.08.2010

Теперь вы можете использовать nmap встроенный скрипт NSE под названием ssh-auth-methods для этого:

# nmap -p 22 --script ssh-auth-methods 192.168.1.2

Starting Nmap 7.60 ( https://nmap.org ) at 2017-12-26 00:56 GMT
Nmap scan report for 192.168.1.2
Host is up (0.027s latency).

PORT   STATE SERVICE
22/tcp open  ssh
| ssh-auth-methods:
|   Supported authentication methods:
|     publickey
|_    keyboard-interactive
MAC Address: AA:BB:CC:DD:EE:FF (Apple)

Nmap done: 1 IP address (1 host up) scanned in 2.40 seconds

Кроме того, кто-то сделал подобный скрипт python3.

person not2qubit    schedule 26.12.2017

Если вам нужно решение *nix, вы также можете подключиться к источникам OpenSSH. Если вам подходит Windows - вы также можете попробовать некоторые коммерческие библиотеки .NET, они намного удобнее, чем исходники OpenSSH :)

person Nickolay Olshevsky    schedule 27.08.2010