Postgresql 中文操作指南
19.11. Secure TCP/IP Connections with SSH Tunnels #
可以使用 SSH 来加密客户端和 PostgreSQL 服务器之间的网络连接。如果正确完成,即使对于没有 SSL 功能的客户端,这也会提供足够安全的网络连接。
首先确保 SSH 服务器与 PostgreSQL 服务器在同一台计算机上正常运行,并且您可以使用 ssh 作为某个用户登录;然后可以建立到远程服务器的安全隧道。安全隧道侦听本地端口并将所有流量转发到远程计算机上的端口。发送到远程端口的流量可以到达其 localhost 地址,或者根据需要使用其他绑定地址;它不会显示为来自您的本地计算机。命令从客户端计算机 foo.com 创建到远程计算机的安全隧道:
ssh -L 63333:localhost:5432 joe@foo.com
-L 参数中的第一个数字 63333 是隧道的本地端口号;它可以是任何未使用的端口。(IANA 将端口 49152 至 65535 保留给私人使用。)之后的名称或 IP 地址是您连接的远程绑定地址,即,localhost,这是默认值。第二个数字 5432 是隧道的远程端,例如,您数据库服务器正在使用的端口号。为了使用此隧道连接到数据库服务器,您可以连接到本地计算机上的端口 63333:
psql -h localhost -p 63333 postgres
对数据库服务器来说,看起来您就是 joe 用户,在 foo.com 主机上连接到 localhost 绑定地址,并且它将使用为该用户对该绑定地址的连接配置的任何验证过程。请注意,服务器不会认为连接是 SSL 加密的,因为实际上它并没有在 SSH 服务器和 PostgreSQL 服务器之间加密。由于它们位于同一台计算机上,因此这不会造成任何额外的安全风险。
为了使隧道设置成功,您必须被允许作为 joe@foo.com 通过 ssh 连接,就像您尝试使用 ssh 创建终端会话一样。
您还可以将端口转发设置为
ssh -L 63333:foo.com:5432 joe@foo.com
但随后数据库服务器会看到该连接来自其 foo.com 绑定地址,而该绑定地址未通过默认设置 listen_addresses = 'localhost' 打开。通常这不是您想要的。
如果您必须通过某些登录主机“跳”到数据库服务器,一个可能的设置看起来如下:
ssh -L 63333:db.foo.com:5432 joe@shell.foo.com
请注意,通过这种方式,从 shell.foo.com 到 db.foo.com 的连接将不会通过 SSH 隧道进行加密。当网络以各种方式受到限制时,SSH 提供很多配置可能性。请参阅 SSH 文档了解详情。