簡體   English   中英

如何使用 Fabric 和 fabfile 解密受密碼保護的 SSH 密鑰?

[英]How to decrypt passphrase-protected SSH key using Fabric and fabfile?

我在過程GettingStarted與面料2.4.0,我想不出一個優雅和安全的方式來解密我的SSH密鑰將其傳遞到織物上。 我的代碼如下:

#!/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 詢問我運行上面的 fabfile 的加密密碼?
  2. python fabfile.py是運行上述命令的可接受的語法嗎?
  3. 2018 年自動將 SSH 密鑰從用戶計算機傳遞到腳本的最佳安全實踐是什么? 使用os.environ()可以接受?

我在關於身份驗證的文檔中看到,Fabric 指出The connect_kwargs.passphrase config option is the most direct way to supply a passphrase to be used automatically.

但緊接着它說:

對此類材料使用實際的磁盤配置文件並不總是明智的,但請記住,配置系統能夠從其他來源加載數據,例如您的 shell 環境甚至任意遠程數據庫。

從安全的角度來看,我擔心以錯誤的方式設置它。 使用環境變量傳遞 ssh 密碼是否足夠安全? 如果是這樣,讓這個命令與加密的 SSH 密鑰一起工作的工作代碼片段是什么樣的?

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

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

在使用 CLI 選項執行命令之前,可以提示腳本用戶輸入 SSH 密鑰的密碼。

這負責合並轉發給 Paramiko 的connect_kwargs選項中的密碼短語。

fab --prompt-for-passphrase <command>

上述方法的問題是每次運行命令時都必須輸入密碼。

按照文檔中的建議,您可以在 shell 會話中導出環境變量。 例如

export SSH_PASSPHRASE="gongo-aso!"

然后可以從傳遞給Connection對象的構造函數的connect_kwargs選項中讀取和使用它。

#!/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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM