Параметрическая проверка подлинности
У меня возникла проблема с подключением к устройству с помощью клиента ssh (версии 1.7.6-2):
$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("123.0.0.1", username="root", password=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect
self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 481, in _auth
raise saved_exception
paramiko.AuthenticationException: Authentication failed.
>>>
Когда я использую ssh из командной строки, он отлично работает:
ssh [email protected]
BusyBox v1.12.1 (2010-11-03 13:18:46 EDT) built-in shell (ash)
Enter 'help' for a list of built-in commands.
#
Кто-нибудь видел это раньше?
Изменить 1
Вот подробный вывод команды ssh:
:~$ ssh -v [email protected]
OpenSSH_5.3p1 Debian-3ubuntu4, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 123.0.0.1 [123.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/waffleman/.ssh/identity type -1
debug1: identity file /home/waffleman/.ssh/id_rsa type -1
debug1: identity file /home/waffleman/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1
debug1: match: OpenSSH_5.1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '123.0.0.1' is known and matches the RSA host key.
debug1: Found key in /home/waffleman/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentication succeeded (none).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.utf8
Изменить 2
Вот вывод python с выходом отладки:
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko, os
>>> paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG)
>>> ssh = paramiko.SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("123.0.0.1", username='root', password=None)
DEBUG:paramiko.transport:starting thread (client mode): 0x928756cL
INFO:paramiko.transport:Connected (version 2.0, client OpenSSH_5.1)
DEBUG:paramiko.transport:kex algos:['diffie-hellman-group-exchange-sha256', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', '[email protected]', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] server encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', '[email protected]', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] client mac:['hmac-md5', 'hmac-sha1', '[email protected]', 'hmac-ripemd160', '[email protected]', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', '[email protected]', 'hmac-ripemd160', '[email protected]', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', '[email protected]'] server compress:['none', '[email protected]'] client lang:[''] server lang:[''] kex follows?False
DEBUG:paramiko.transport:Ciphers agreed: local=aes128-ctr, remote=aes128-ctr
DEBUG:paramiko.transport:using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes128-ctr, remote aes128-ctr; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none
DEBUG:paramiko.transport:Switch to new keys ...
DEBUG:paramiko.transport:Trying discovered key b945197b1de1207d9aa0663f01888c3c in /home/waffleman/.ssh/id_rsa
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (publickey) failed.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect
self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 481, in _auth
raise saved_exception
paramiko.AuthenticationException: Authentication failed.
>>>
Ответы
Ответ 1
Сервер ssh на удаленном устройстве отклонил вашу аутентификацию. Убедитесь, что вы используете правильный ключ, открытый ключ присутствует в authorized_keys
ключах, authorized_keys
доступа к каталогу .ssh
верны, authorized_keys
доступа разрешены, а на устройстве нет никаких других ограничений доступа. Трудно сказать, что происходит без логов с сервера.
[РЕДАКТИРОВАТЬ] Я только что оглянулся на ваш вывод, вы аутентифицируетесь с использованием None
аутентификации. Обычно это никогда не разрешается и используется для определения того, какие методы авторизации разрешены сервером. Возможно, ваш сервер использует аутентификацию на основе хоста (или ее вообще нет).
Поскольку auth_none()
используется редко, он недоступен из класса SSHClient
, поэтому вам нужно будет напрямую использовать Transport
.
transport.auth_none('root')
Ответ 2
В качестве очень позднего продолжения этого вопроса я считаю, что столкнулся с той же проблемой, что и вафля, в контексте ограниченной сети.
Намек на использование auth_none
в Transport
объекте оказался весьма полезным, но я немного озадачился тем, как это реализовать. Дело в том, что, по крайней мере, на сегодняшний день я не могу получить Transport
объект объекта SSHClient
пока он не подключится; но это не будет подключаться в первую очередь...
Так что в случае, если это полезно для других, моя работа вокруг ниже. Я просто переопределяю метод _auth
.
Хорошо, это хрупко, потому что _auth
- это личное дело. Моими другими альтернативами были - на самом деле все еще есть - вручную создавать объекты Transport
и Channel
, но в настоящее время я чувствую, что мне намного лучше, когда все это еще под капотом.
from paramiko import SSHClient, BadAuthenticationType
class SSHClient_try_noauth(SSHClient):
def _auth(self, username, *args):
try:
self._transport.auth_none(username)
except BadAuthenticationType:
super()._auth(username, *args)
Ответ 3
Убедитесь, что разрешения для файлов открытого и закрытого ключей (и, возможно, папка с содержимым) установлены на очень ограничительные (то есть chmod 600 id_rsa). Оказывается, это необходимо (операционной системой?) Для использования файлов в качестве ключей ssh. Обнаружил это от моего полезного коллеги:)
Также убедитесь, что вы используете правильное имя пользователя для данного ключа ssh.
Ответ 4
paramiko SSHClient имеет load_system_host_keys
метод, который вы может использовать для загрузки набора определенных пользователем ключей. Как следует из примера в документах, его необходимо запустить перед подключением к серверу.
Ответ 5
Я получаю схожую ошибку, когда сервер использует аутентификацию AD. Я думаю, что это ошибка парамико. Я узнал, что перед использованием paramiko мне нужно установить ключи ssh.
Ответ 6
На стороне сервера могут быть разные причины (sshd, к которому вы подключаетесь), поэтому отладка на стороне клиента может быть затруднена.
Например, tail -f/var/log/secure
:
9 октября 15:50:26 pc1udatahgw04 sshd [27501]: Отказ в аутентификации: неправильное владение или режимы для каталога /home/testuser
Если вы запустите ls -lad/home/testuser
для просмотра разрешений, вы увидите, например, в нашем случае:
$ ls -lad /home/testuser
drwxrwxr-x 16 testuser testgroup 57344 Oct 9 15:23 /home/testuser
Обратите внимание на второй w
бит. Домашний каталог был открыт для групповой записи. sshd
этом случае sshd
отказывается от аутентификации на основе ключей.
Опять же, проверьте лог sshd на стороне сервера. Могут быть и другие проблемы, такие как уже упомянутые
- /home/user/.ssh каталог слишком открыт
- /home/user/.ssh/id_rsa файл слишком открыт
- /home/user/.ssh/id_rsa.pub файл слишком открыт
- /home/user/.ssh/id_ecdsa файл слишком открыт
- /home/user/.ssh/id_ecdsa.pub файл слишком открыт
так далее..
Ответ 7
Я попытался удалить папку ~./ssh, тогда она хорошо работает