17.10. 用SSH隧道进行安全 TCP/IP 连接
使用SSH对PostgreSQL 服务器和客户端之间的网络连接进行加密是可能的。经过适当处理后, 这样做可以获得一个足够安全的网络连接。即使是没有 SSL 的客户端上也如此。
首先确认SSH正在和PostgreSQL 服务器的同一台机器上正确地运行,而且你可以通过某个用户用ssh
登录。 然后你可以用下面这样的命令从客户端的机器上建立一个安全通道:
ssh -L 63333:localhost:5432 [email protected]
-L
参数的第一个数字(63333)是你这端通道的端口号,可以是任何未使用的端口。 (IANA提供端口49152到65535位私人使用。)第二个数字(5432)是通道的远端, 也就是服务器使用的端口号。在两个端口号之间的名称或者 IP 地址是你准备连接的数据库服务器, 在例子中是foo.com
。为了使用这个通道与数据库服务器连接, 你在本机于端口63333连接:
psql -h localhost -p 63333 postgres
对于数据库服务器而言,在这种情况下,它会把你当做主机foo.com
连接到localhost
的真正的用户joe
, 并且使用为这个用户和主机设置的认证手段进行认证。请注意,服务器不会认为连接是 SSL 加密的, 因为实际上在SSH服务器和PostgreSQL 服务器之间是没有加密的。只要它们在同一台机器上,这么做并不会导致任何安全漏洞。
为了保证能够成功地建立通道,你必须被允许作为[email protected]
通过ssh
建立连接,就像你使用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文档获取详情。
Tip: 还有几种不同的产品可以提供安全的通道,所使用的过程类似我们刚刚描述的过程。