Назад | Перейти на главную страницу

Использование конфигурации SSH и ключей в / etc / ssh с Fabric

Я пытаюсь использовать SSH-ключи с Fabric вместо того, чтобы вводить пароль каждый раз при запуске fab. Все наши хозяева разделяют одно и то же /etc/ssh/ssh_known_hosts файл, который содержит все их общедоступные ключи rsa, и я могу использовать SSH без пароля с одного хоста на другой.

Я должен следовать env vars, установленным в моем fabfile.py:

env.use_ssh_config = True
env.ssh_config_path = '/etc/ssh/ssh_config'
env.key_filename = '/etc/ssh/ssh_host_rsa_key'

я бегу fab test как root с помощью простой команды:

def test:
    run('uname -s')

Я просмотрел все документы и немало искал, но я не вижу примеров использования ключей и конфигураций в /etc/ssh; примеры обычно показывают, как использовать конфигурации и ключи в ~/.ssh/, поэтому я могу неправильно понять, как использовать эти настройки.

Вот отладка:

root@beef:~> fab test
[chicken] Executing task 'test'
[chicken] run: uname -s
DEBUG:ssh.transport:starting thread (client mode): 0x141c710L
INFO:ssh.transport:Connected (version 1.99, client OpenSSH_5.1)
DEBUG:ssh.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', 'rijndael-cbc@lysator.liu.se', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] server encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', 'rijndael-cbc@lysator.liu.se', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] client mac:['hmac-md5', 'hmac-sha1', 'umac-64@openssh.com', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', 'umac-64@openssh.com', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', 'zlib@openssh.com', 'zlib'] server compress:['none', 'zlib@openssh.com', 'zlib'] client lang:[''] server lang:[''] kex follows?False
DEBUG:ssh.transport:Ciphers agreed: local=aes128-ctr, remote=aes128-ctr
DEBUG:ssh.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:ssh.transport:Switch to new keys ...
DEBUG:ssh.transport:Adding ssh-rsa host key for chicken: 56f3f71a494013976c183844d342ed1b
[chicken] Login password for 'root':

Системный журнал включен chicken говорит

22 июня 13:48:47 цыпленок sshd [7328]: не получил строку идентификации от 172.x.x.x

Так что я не передаю нужный ключевой файл или что-то в этом роде ...

ОБНОВИТЬ

Я получил несколько советов по устранению неполадок из списка рассылки пользователей Fabric.

Я вижу, что когда я подключаюсь к ssh-клиенту из своей оболочки, клиент запрашивает метод подключения «none», а затем «hostbased». Fabric (или Paramiko), похоже, сразу же запрашивает публичный ключ. Обратите внимание на методы подключения, выбранные в каждом примере:

успешный вход в систему

root@beef:~> ssh -t -i /etc/ssh/ssh_host_rsa_key chicken uname -s

root@chicken:~> /usr/sbin/sshd -d
...snip...
debug1: userauth-request for user root service ssh-connection method none
debug1: attempt 0 failures 0
debug1: PAM: initializing for "root"
debug1: userauth-request for user root service ssh-connection method hostbased
debug1: attempt 1 failures 0
debug1: userauth_hostbased: cuser root chost beef. pkalg ssh-dss slen 55
debug1: PAM: setting PAM_RHOST to "beef"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: fd 4 clearing O_NONBLOCK
debug1: restore_uid: 0/0
Failed hostbased for root from 172.x.x.x port 54623 ssh2
debug1: userauth-request for user root service ssh-connection method hostbased
debug1: attempt 2 failures 1
debug1: userauth_hostbased: cuser root chost beef. pkalg ssh-rsa slen 271
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: fd 4 clearing O_NONBLOCK
debug1: restore_uid: 0/0
debug1: ssh_rsa_verify: signature correct
debug1: do_pam_account: called
Accepted hostbased for root from 172.x.x.x port 54623 ssh2

Неудачный вход через Fabric

root@beef:~ > fab test

root@chicken:~> /usr/sbin/sshd -d
...snip...
debug1: userauth-request for user root service ssh-connection method publickey
debug1: attempt 0 failures 0
debug1: PAM: initializing for "root"
debug1: PAM: setting PAM_RHOST to "beef"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys2
debug1: restore_uid: 0/0
Failed publickey for root from 172.x.x.x port 54630 ssh2

Итак ... вопрос: есть ли способ указать hostbased в качестве предпочтительного метода подключения в Fabric / Paramiko?

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

Есть ли способ указать hostbased в качестве предпочтительного метода подключения? Можно ли установить настройки Paramiko в моем fabfile?

Один из авторов ответил:

Я не думаю, что Paramiko поддерживает хостинг, хотя изначально это не моя библиотека, поэтому я могу ошибаться. Конечно, Fabric не сообщает, что это ключ на основе, кроме того, что дает ему ключ (т.е. в client.connect () нет очевидной настройки «список схем аутентификации, чтобы попробовать»).

Paramiko - это SSH-модуль Python, который использует Fabric. Итак, похоже, что нет возможности установить предпочтительную схему аутентификации в Fabric / Paramiko. Вместо попытки бежать fab как root и не получать запрос пароля, я решил, что лучше всего запускать свои команды, используя sudo() в моем fabfile, так что я могу иметь контрольный журнал в /var/log/sudo.log. Это требует, чтобы я все равно передал свой пароль sudo в качестве аргумента.