如何制作临时ssh管道?

如何制作临时ssh管道?

我想将千兆字节的数据从服务器 A 传输到 B。它们位于不同的网络中,但都可以通过 SSH 访问。我在另一个网络中(既不是 A 也不是 B),所以我宁愿在服务器之间进行传输,而不是通过我的系统进行隧道传输。如何通过 SSH 等加密通道最好地执行此操作?

最简单的选项可能是加密的 tar 管道 ( tar | openssl enc | netcat),但感觉不太简洁。

另一种选择是临时添加用户并将其用于 ssh 管道 ( tar | ssh),或者临时向现有用户添加授权密钥并执行相同的操作。这确实允许竞争条件,即使其中一台服务器具有等待此类特定条件的恶意软件的可能性可以忽略不计。它也感觉不完全干净。

这种一次性数据传输的最佳方式是什么?

答案1

如果我理解正确的话,你想在A和B之间建立一个SSH连接,比方说从A到B。可以建立从A到B的TCP连接(B不在防火墙后面,这使得这是不可能的),但您担心,如果 A 不值得信任,允许 A 的用户登录 B 可能会导致 B 出现安全漏洞。

OpenSSH 为此提供了一个简单的解决方案。在~/.ssh/authorized_keys,您可以限制一个按键仅执行一个命令有效。在A上创建一个新的密钥对:

serverA$ ssh-keygen -N '' -f ~/.ssh/copy_to_B.id_rsa
serverA$ cat ~/.ssh/copy_to_B.id_rsa.pub

获取生成的公钥并在行末尾添加强制命令。还要添加restrict阻止端口转发之类的选项(例如,这可能允许 A 发出来自 B 防火墙边界内部的请求)。 B中的新行~/.ssh/authorized_keys如下所示:

ssh-rsa AAAA… luc@serverA restrict command="cat >~/backups/B/latest.tgz"

现在,当使用这个密钥登录 B 时,cat >~/backups/B/latest.tgz无论你传递给什么,命令都会被执行ssh。这样,B所能做的就是写入文件

serverA$ tar … | ssh -i ~/.ssh/copy_to_B.id_rsa luc@serverB whatever

如果 B 上的 SSH 服务器不够新,它可能没有restrict.如果没有restrict,则使用no-port-forwarding,再加上所有其他no-…可用选项(选中man sshdB)。

您可以通过变量引用强制命令中的原始命令SSH_ORIGINAL_COMMAND,但请注意,如果您在这里做了一些复杂的事情,将很难确保您没有打开安全漏洞。这是一个简单的包装器,它允许 B 通过将所需的文件名作为命令传递来写入任何文件~/backups/B- 请注意,包装器将字符列入白名单,以避免写入../../.ssh/authorized_keys.

ssh-rsa AAAA… luc@serverA restrict command="case $SSH_ORIGINAL_COMMAND in *[!-.A-Za-z0-9_]*) echo >&2 'bad target file'; exit 120;; [!-.]*) cat >~/backups/B/\"$SSH_ORIGINAL_COMMAND\";; *) echo >&2 'bad target file'; exit 120;; esac"

答案2

您需要使用有效用户进行访问,不仅是因为 ssh 身份验证,还因为文件权限和所有权。

我真的很喜欢rsync网上转账。可以恢复增量数据传输,当您无法完全控制两台服务器之间的网络连接时,这是基础

答案3

如果A可以 sshB并假设您有一个ssh正在运行的代理:

ssh -A A '
  cd /src && tar cf - . | gzip -1 | ssh B "
    cd /dst && gunzip | tar xpf -"'

请注意,通过-A,我们将授予远程用户A访问您的 ssh 代理的权限。如果您不信任该服务器的管理员或任何有权访问该远程用户帐户的人,您可能不想这样做。他们将无法检索您的 ssh 密钥,但可以在该ssh命令运行时使用它对其他计算机进行身份验证。

相关内容