2010-08-27 2 views
8

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

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

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

ответ

13

Я сейчас строю один сам, однако вы можете заставить 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). 
+0

Nice и простой. Благодарю. Будет интересен ваш код, если он окажется открытым исходным кодом ... – Stef

+0

К сожалению, этот конкретный блок кода не сможет быть открытым. Сожалею. Вот почему я хотел поделиться первоначальными мыслями, прежде чем мне нужно прекратить говорить об этом. – Eadwacer

7

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

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

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

-1

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

0

Теперь вы можете использовать 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 

Кроме того, кто-то сделал similar python3 script.