是否必须在 Web 应用服务器上运行 SSH 命令才能将 Web 应用连接到私有子网中的 RDS?

Do I have to run SSH command on my web app server to connect web app to RDS in private subnet?

提问人:Morris 提问时间:11/7/2023 最后编辑:John RotensteinMorris 更新时间:11/8/2023 访问量:18

问:

我正在尝试遵循良好的安全实践:我将 RDS 放在私有子网中,只能通过公有 EC2(跳转盒)访问。我需要 RDS 的 Web 应用服务器托管在另一个云(fly.io,而不是 AWS)中。为了让 Web 应用程序连接到 RDS,我的计划是在我的 Web 服务器上执行命令,以打开应用程序主机和跳转盒之间的 SSH 隧道。

是否有建议的工作流来设置应用部署过程以包含此类端口转发命令?

此外,对于像 fly.io 这样的平台,我可能不会在每次部署时都控制 1 个专用服务器/pod。SSH 端口转发需要私钥 pem 文件。那么,这是否意味着我必须在部署过程中包含一个步骤,以“将私有密钥文件复制到 Web 服务器上,以便它可以通过 SSH 连接到 EC2 跳转盒”?

amazon-web-services 部署 amazon-rds 堡垒主机

评论


答:

2赞 John Rotenstein 11/8/2023 #1

将计算资源和数据库资源分开通常不是一个好主意。将它们放在不同的云中会增加两个服务之间的延迟,使每个数据库查询的速度变慢。这在它们位于不同国家/地区的地方尤为明显。通过 Jump-box 发送流量也会增加延迟。

实际上,您不需要将数据库放在私有子网中。这只是基于传统网络的建议。您可以将其放在公有子网,并使用安全组添加保护层。这通常会授予对来自特定 IP 地址的入站流量的访问权限。但是,查看 ,您的应用程序将显示位于许多不同的 IP 地址,因此这不起作用。fly.io

因此,使用 SSH jump-box 可能是真正保护您的数据库免受一般 Internet 访问的唯一方法。您不需要“将私钥文件复制到 Web 服务器上”。相反,用于创建 SSH 连接的代码可以是应用的一部分。

你没有提到你的应用使用的技术,但作为一个例子,Python 有一个名为 Paramiko 的库,可以通过代码建立 SSH 连接。您可以在应用中包含这些功能,包括用于建立 SSH 连接的私钥。这样,建立 SSH 连接的是你的应用,而不是服务器