17.10. 用SSH隧道进行安全 TCP/IP 连接

使用SSHPostgreSQL 服务器和客户端之间的网络连接进行加密是可能的。经过适当处理后, 这样做可以获得一个足够安全的网络连接。即使是没有 SSL 的客户端上也如此。

首先确认SSH正在和PostgreSQL 服务器的同一台机器上正确地运行,而且你可以通过某个用户用ssh登录。 然后你可以用下面这样的命令从客户端的机器上建立一个安全通道:

ssh -L 63333:localhost:5432 joe@foo.com

-L参数的第一个数字(63333)是你这端通道的端口号,可以是任何未使用的端口。 (IANA提供端口49152到65535位私人使用。)第二个数字(5432)是通道的远端, 也就是服务器使用的端口号。在两个端口号之间的名称或者 IP 地址是你准备连接的数据库服务器, 在例子中是foo.com。为了使用这个通道与数据库服务器连接, 你在本机于端口63333连接:

psql -h localhost -p 63333 postgres

对于数据库服务器而言,在这种情况下,它会把你当做主机foo.com 连接到localhost的真正的用户joe, 并且使用为这个用户和主机设置的认证手段进行认证。请注意,服务器不会认为连接是 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.comdb.foo.com 的连接将不会通过SSH通道加密。当网络以各种方式被限制时,SSH提供了相当多的配置可能性。 请参阅SSH文档获取详情。

提示: 还有几种不同的产品可以提供安全的通道,所使用的过程类似我们刚刚描述的过程。