如何使用 Fabric 和 fabfile 解密受密码保护的 SSH 密钥?

Sco*_*les 5 python ssh paramiko fabric

我正在入门过程中Fabric 2.4.0,但我无法找到一种优雅且安全的方法来解密我的 SSH 密钥以将其传递给 Fabric。我的代码如下:

\n\n
#!/usr/bin/env python3\n"""fabfile"""\nfrom fabric import Connection\n\nc = Connection(\'user@ip.address\')\nresult = c.run(\'uname -s\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这个简单的例子中,运行python fabfile.py我收到错误:

\n\n
File "/Users/user.name/GitHub/app_name/fabfile.py", line 6, in <module>\nresult = c.run(\'uname -s\')\nFile "<decorator-gen-3>", line 2, in run\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/fabric/connection.py", line 29, in opens\nself.open()\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/fabric/connection.py", line 615, in open\nself.client.connect(**kwargs)\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 437, in connect\npassphrase,\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 749, in _auth\nraise saved_exception\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 720, in _auth\nfilename, pkey_class, passphrase\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/client.py", line 571, in _key_from_filepath\nkey = klass.from_private_key_file(key_path, password)\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/pkey.py", line 206, in from_private_key_file\nkey = cls(filename=filename, password=password)\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/rsakey.py", line 55, in __init__\nself._from_private_key_file(filename, password)\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/rsakey.py", line 175, in _from_private_key_file\ndata = self._read_private_key_file("RSA", filename, password)\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/pkey.py", line 279, in _read_private_key_file\ndata = self._read_private_key(tag, f, password)\nFile "/Users/user.name/anaconda/envs/virtual_env/lib/python3.6/site-packages/paramiko/pkey.py", line 329, in _read_private_key\nraise PasswordRequiredException("Private key file is encrypted")\nparamiko.ssh_exception.PasswordRequiredException: Private key file is encrypted\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 如何让 Fabric 和 paramiko 询问我运行上面 fabfile 的加密密码?
  2. \n
  3. python fabfile.py运行上述命令的语法是可接受的吗?
  4. \n
  5. 2018 年自动将 SSH 密钥从用户计算机传递到脚本的最佳安全实践是什么?使用os.environ()可以接受吗?
  6. \n
\n\n

我在有关身份验证的文档中看到,Fabric 注释The connect_kwargs.passphrase config option is the most direct way to supply a passphrase to be used automatically.

\n\n

但紧接着它又说:

\n\n
\n

对于此类材料使用实际的磁盘上配置文件\xe2\x80\x99t\n 总是明智的,但请记住,配置系统能够\n 从其他来源加载数据,例如你的 shell 环境,\n 甚至任意远程数据库。

\n
\n\n

从安全角度来看,我担心以错误的方式进行设置。使用环境变量传递 ssh 密码足够安全吗?如果是这样,让此命令与加密的 SSH 密钥一起使用的工作代码片段是什么样的?

\n\n
#!/usr/bin/env python3\n"""fabfile"""\nfrom fabric import Connection\n\nc = Connection(\'user@ip.address\')\nresult = c.run(\'uname -s\')\n
Run Code Online (Sandbox Code Playgroud)\n

Olu*_*ule 4

在使用 CLI 选项执行命令之前,系统会提示脚本的用户输入 SSH 密钥的密码。

这负责将密码短语合并到connect_kwargs转发给 Paramiko 的选项中。

fab --prompt-for-passphrase <command>
Run Code Online (Sandbox Code Playgroud)

上述方法的问题是每次运行命令时都必须输入密码。

根据文档中的建议,您可以在 shell 会话中导出环境变量。例如

export SSH_PASSPHRASE="gongo-aso!"
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)