可以使用 SSH 来加密客户端和 PostgreSQL 服务器之间的网络连接。如果操作得当,这可以提供足够安全的网络连接,即使对于不支持 SSL 的客户端也是如此。
首先确保 SSH 服务器在与 PostgreSQL 服务器相同的机器上正常运行,并且您可以使用 ssh
作为某个用户登录;然后您可以建立一个到远程服务器的安全隧道。安全隧道监听本地端口,并将所有流量转发到远程机器上的端口。发送到远程端口的流量可以到达其 localhost
地址,或者如果需要,可以使用不同的绑定地址;它不会显示为来自您的本地机器。以下命令会创建从客户端机器到远程机器 foo.com
的安全隧道。
ssh -L 63333:localhost:5432 [email protected]
-L
参数中的第一个数字 63333 是隧道的本地端口号;它可以是任何未使用的端口。(IANA 保留 49152 到 65535 端口供私有使用。)此后的名称或 IP 地址是您连接的远程绑定地址,即 localhost
,这是默认值。第二个数字 5432 是隧道的远程端,例如,您的数据库服务器正在使用的端口号。为了使用此隧道连接到数据库服务器,您需要连接到本地计算机上的端口 63333。
psql -h localhost -p 63333 postgres
对于数据库服务器而言,看起来像是用户 joe
在主机 foo.com
上连接到 localhost
绑定地址,并且它将使用为该用户到该绑定地址的连接配置的任何身份验证过程。请注意,服务器不会认为连接是 SSL 加密的,因为实际上在 SSH 服务器和 PostgreSQL 服务器之间没有加密。这不应该构成任何额外的安全风险,因为它们位于同一台机器上。
为了使隧道设置成功,您必须被允许通过 ssh
连接为 [email protected]
,就像您尝试使用 ssh
创建终端会话一样。
您也可以将端口转发设置为
ssh -L 63333:foo.com:5432 [email protected]
但是数据库服务器会看到连接来自其 foo.com
绑定地址,而默认设置 listen_addresses = 'localhost'
并未打开该地址。这通常不是您想要的结果。
如果您必须通过某个登录主机“跳跃”到数据库服务器,一种可能的设置可能如下所示
ssh -L 63333:db.foo.com:5432 [email protected]
请注意,通过这种方式,从 shell.foo.com
到 db.foo.com
的连接不会通过 SSH 隧道加密。当网络以各种方式受到限制时,SSH 提供了相当多的配置可能性。请参阅 SSH 文档了解详细信息。
还有其他一些应用程序可以使用与刚才描述的概念类似的过程来提供安全隧道。
如果您在文档中发现任何不正确的内容,或者与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。