【问题标题】:How to decrypt passphrase-protected SSH key using Fabric and fabfile?如何使用 Fabric 和 fabfile 解密受密码保护的 SSH 密钥?
【发布时间】:2018-11-05 21:01:00
【问题描述】:

我正在使用 Fabric 2.4.0 处理GettingStarted,我无法找到一种优雅且安全的方法来解密我的 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 向我询问运行上述 fabfile 的加密密码?
  2. python fabfile.py 是运行上述命令的可接受语法吗?
  3. 在 2018 年自动将 SSH 密钥从用户计算机传递到脚本的最佳安全实践是什么?使用os.environ() 可以接受吗?

我在 authentication 上的文档中看到,Fabric 注释 The connect_kwargs.passphrase config option is the most direct way to supply a passphrase to be used automatically.

但紧接着它说:

对这种类型的材料使用实际的磁盘配置文件不是 总是明智的,但请记住,配置系统能够 从其他来源加载数据,例如您的 shell 环境或 甚至是任意远程数据库。

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

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

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

【问题讨论】:

    标签: python ssh paramiko fabric


    【解决方案1】:

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

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

    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')
    

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 2011-05-09
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多