如何在两台服务器之间执行安全的自动文件传输?

如何在两台服务器之间执行安全的自动文件传输?

我想每天将一些文件从服务器 A 传输到服务器 B(用于备份)。但是,我找不到不造成安全漏洞的方法。我的目标是让在服务器 A 上具有 sudo 权限的人无法利用此传输连接到服务器 B。

我的基本想法是做一个scp带有(或类似)命令的 cronjob。显然,在 A 和 B 之间使用基于密码的 SSH 连接不起作用,而据我所知,使用基于密钥的 SSH 连接将允许服务器 A 的用户通过 A 直接连接到 B。

我不是安全专家,我可能忽略了这一点。有什么方法可以实现我想要的吗?

我也不希望服务器 B 的用户能够连接到服务器 A。

答案1

您无法向具有 root 访问权限的人隐藏系统上的任何内容。即使您在登录时使用加密的主目录,它也会被解密,root 用户可以访问数据。

完成此任务的最简单方法可能是设置一个能够通过 SSH 登录到服务器 A 和服务器 B 的第三个实例。然后,您可以使用命令scp(在第三个实例上)以以下方式将文件从 A 复制到 B。

scp -3 serverA:/path/to/the/file serverB:/path/to/store/
  • 主机serverA和在第三个实例serverB中配置。~/.ssh/config

请注意选项-3,它使第三个实例作为中间服务器运行。如果没有显示此选项,服务器 A 将被指示连接到服务器 B,但需要凭据。此选项将禁用进度表。

答案的详细版本可在历史

答案2

rsync像往常一样在 cronjob 中使用。

在 rsync 客户端上,具有“sudo”权限的用户将能够看到访问所需的用户名和密码rsync 服务器共享的特定文件夹

但这些凭证与用户凭证是分开的,不会授予 SSH 对服务器的访问权限。因此,如果配置正确,他们在服务器上所能访问的只是来自他们自己机器的备份。

在 rsync 服务器上,没有任何东西可以访问 rsync 客户端。

答案3

只需发送文件serverA,而不是让 serverA 上的用户从 serverB 复制。如果要从 复制foo.txtserverBserverA可以通过两种基本方式进行:

  1. 运行命令以serverA从 中获取文件serverB
  2. 运行命令serverB以将文件发送至serverA

在第二种情况下,没有人serverA需要访问serverB。因此,从 serverB 设置基于密钥的 sshserverA,然后将你的 cron 行添加到相关用户在服务器B上

例如,要手动执行此操作,您可以执行以下操作:

user1@serverB $ scp /path/to/foo.txt user1@serverA:/path/to/foo.txt

这样, 上的任何人serverA都无法访问 ,serverB并且您只需要有一个用户serverB可以登录serverA

答案4

ssh 和 rsync(以及 SFTP)将始终为您提供所连接服务器的登录信息,您可能能够或无法控制该服务器。

为什么不使用 HTTPS?

您可以

  1. 在 A 上运行服务器并拥有 B得到数据
  2. 或者在 B 上运行并让 A邮政它。

为了保护数据不被无关的第三方获取,你必须加密连接(使用 HTTPS,而不是普通的 HTTP)至少使用基本认证

这不会保护两个系统上任何一方的根用户的数据:两者都可能数据和调整他们在各自的立场上对此无能为力。

可以通过多种方式启动简单的 HTTP 服务器,例如:

python -m SimpleHTTPServer 8080

加密连接需要创建 SSL 证书和几行 Python 代码:

#!/usr/bin/python
import BaseHTTPServer, SimpleHTTPServer
import ssl

httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 8443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile='./certs_and_key.pem', server_side=True)
httpd.serve_forever()

基本身份验证需要更多代码,但也能做完了。

相关内容