我想每天将一些文件从服务器 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.txt
到serverB
,serverA
可以通过两种基本方式进行:
- 运行命令以
serverA
从 中获取文件serverB
。 - 运行命令
serverB
以将文件发送至serverA
。
在第二种情况下,没有人serverA
需要访问serverB
。因此,从 serverB 设置基于密钥的 ssh到serverA,然后将你的 cron 行添加到相关用户在服务器B上。
例如,要手动执行此操作,您可以执行以下操作:
user1@serverB $ scp /path/to/foo.txt user1@serverA:/path/to/foo.txt
这样, 上的任何人serverA
都无法访问 ,serverB
并且您只需要有一个用户serverB
可以登录serverA
。
答案4
ssh 和 rsync(以及 SFTP)将始终为您提供所连接服务器的登录信息,您可能能够或无法控制该服务器。
为什么不使用 HTTPS?
您可以
- 在 A 上运行服务器并拥有 B得到数据
- 或者在 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()
基本身份验证需要更多代码,但也能做完了。