0

我必须通过跳转主机 ssh 到远程服务器,跳转盒和远程服务器都有自己的 ssh 密钥存储在 yubikeys 上。

有没有办法在 python 中加载 ssh 密钥并将它们传递给 paramiko 进行身份验证?

我想避免使用 ssh-agent/ssh-add 方法并使用全 python 方法,部分原因是到目前为止我无法使用 ssh-agent/ssh-add 成功加载多个 yubikeys,但也因为我想能够打印有关连接的 yubikeys 的信息(如使用 yubikit),这样就不会混淆哪个键/pin 组合用于哪个 ssh 会话(即跳转框或远程服务器)。

我查看了 yubikey-manager 和 python-yubico 但我看不到任何明显的东西可以让我与 paramiko 建立连接或让我访问存储在设备上的密钥。

我目前的流程看起来像

jumpbox_public_addr = '##.##.##.##'
jumpbox_private_addr = '##.##.##.##'
target_addr = '##.##.##.##'

print("Connect Jumpbox")
jumpbox=paramiko.SSHClient()
jumpbox.set_missing_host_key_policy(paramiko.AutoAddPolicy())
jumpbox.load_system_host_keys()
jumpbox.connect(jumpbox_public_addr, username=None, key_filename=None, allow_agent=True)

print("Connect jump channel")
jumpbox_transport = jumpbox.get_transport()
src_addr = (jumpbox_private_addr, 22)
dest_addr = (target_addr, 22)
jumpbox_channel = jumpbox_transport.open_channel("direct-tcpip", dest_addr, src_addr)


print("Connect Remote Server")
target=paramiko.SSHClient()
target.set_missing_host_key_policy(paramiko.AutoAddPolicy())
target.load_system_host_keys()
target.connect(target_addr, username=None, key_filename=None, sock=jumpbox_channel, allow_agent=True)

我真的很想确保我不会混淆 yubikey 并为错误的 yubikey 输入错误的 pin 太多次 - 因为两个键需要同时连接。

当我尝试使用 ssh-agent/ssh-add 方法时,它只提示我输入一个 yubikey 引脚(即使两者都已插入),而且我无法知道它正在加载哪个密钥或使用哪个引脚:

$  ssh-add -s /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
Enter passphrase for PKCS#11:
Card added: /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so

(尝试为第二个键再次运行此操作会产生错误)

理想情况下,有一种 pythonic 方式来加载密钥,这样我就可以准确地告诉用户为每个连接(跳转盒或远程服务器)输入哪个引脚。

4

0 回答 0