Как расшифровать SSH-ключ, защищенный парольной фразой, используя Fabric и fabfile? - PullRequest
0 голосов
/ 03 ноября 2018

Я нахожусь в процессе GettingStarted с Fabric 2.4.0, и я не могу найти элегантный и безопасный способ расшифровки моего SSH-ключа для передачи его в Fabric. Мой код выглядит следующим образом:

#!/usr/bin/env python3
"""fabfile"""
from fabric import Connection

c = Connection('user@ip.address')
result = c.run('uname -s')

В этом простом примере при запуске python fabfile.py я получаю сообщение об ошибке:

File "/Users/user.name/GitHub/app_name/fabfile.py", line 6, in <module>
result = c.run('uname -s')
File "<decorator-gen-3>", line 2, in run
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/fabric/connection.py", line 29, in opens
self.open()
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/fabric/connection.py", line 615, in open
self.client.connect(**kwargs)
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 437, in connect
passphrase,
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 749, in _auth
raise saved_exception
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 720, in _auth
filename, pkey_class, passphrase
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 571, in _key_from_filepath
key = klass.from_private_key_file(key_path, password)
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/pkey.py", line 206, in from_private_key_file
key = cls(filename=filename, password=password)
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/rsakey.py", line 55, in __init__
self._from_private_key_file(filename, password)
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/rsakey.py", line 175, in _from_private_key_file
data = self._read_private_key_file("RSA", filename, password)
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/pkey.py", line 279, in _read_private_key_file
data = self._read_private_key(tag, f, password)
File "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/pkey.py", line 329, in _read_private_key
raise PasswordRequiredException("Private key file is encrypted")
paramiko.ssh_exception.PasswordRequiredException: Private key file is encrypted
  1. Как мне заставить Fabric и paramiko запросить у меня парольную фразу для шифрования, запускающую вышеуказанный файл?
  2. Является ли python fabfile.py приемлемым синтаксисом для запуска вышеуказанных команд?
  3. Какова наилучшая практика безопасности для автоматической передачи ключа SSH с компьютера пользователя в сценарий в 2018 году? Допустимо ли использование os.environ()?

я вижу в документах по аутентификация , Fabric notes The connect_kwargs.passphrase config option is the most direct way to supply a passphrase to be used automatically.

Но потом сразу после этого говорится:

Использование фактических файлов конфигурации на диске для этого типа материала не всегда мудрый, но помните, что система конфигурации способна загрузка данных из других источников, таких как ваша оболочка или даже произвольные удаленные базы данных.

Я обеспокоен тем, что настроил это неправильно с точки зрения безопасности. Достаточно ли безопасно использование переменных среды для передачи парольной фразы ssh? Если да, как выглядит фрагмент рабочего кода, чтобы заставить эту команду работать с зашифрованным ключом SSH?

#!/usr/bin/env python3
"""fabfile"""
from fabric import Connection

c = Connection('user@ip.address')
result = c.run('uname -s')

1 Ответ

0 голосов
/ 05 ноября 2018

Пользователю вашего скрипта может быть предложено ввести ключевую фразу для ключа SSH перед выполнением команд с параметром CLI.

Это обеспечивает объединение ключевой фразы в опциях connect_kwargs, пересылаемых в Paramiko.

fab --prompt-for-passphrase <command>

Проблема с вышеуказанным подходом заключается в необходимости вводить фразу-пароль каждый раз, когда вы запускаете команду.

Как указано в документации, вы можете экспортировать переменную среды в сеансе оболочки. , например

export SSH_PASSPHRASE="gongo-aso!"

Затем его можно прочитать и использовать в параметрах connect_kwargs, передаваемых конструктору для объекта Connection.

#!/usr/bin/env python3
"""fabfile"""
from os import getenv
from fabric import Connection

connect_kwargs = {
    'passphrase': getenv('SSH_PASSPHRASE')
}

c = Connection('user@ip.address', connect_kwargs=connect_kwargs)
result = c.run('uname -s')
...