您查看的文章来源于http://www.oklinux.cn
SSH 隧道使用端口转发
IP 转发是一项隧道(tunneling)技术,它可以将 Internet 包从一台主机转发到另一台主机。它允许您的 PostgreSQL 客户机,比如 psql、pgadmin 甚至 openoffice,通过一个 SSH 连接与远程 Postgres 服务器建立联系。
考虑下面的问题:
?如果远程 PostgreSQL 服务器上不存在 psql 客户机,会发生什么?
?如果需要在您的工作站和远程主机之间上传或下载数据,会发生什么?
?如果需要使用数据库客户机来执行 psql 客户机无法很好地执行或根本无法执行的任务,该怎么做?
?如何对网络使用隧道,从而使您的团队能够远程连接到防火墙后面的数据库?
这个例子将一个客户机(本地主机)连接到一台远程主机(192.168.2.100)。在工作站的端口 10000 创建了一个代理连接。客户机连接到端口 10000 后,被转发到远程主机的 PostgreSQL 服务器,后者正在侦听端口 5432:ssh -L 10000:localhost:5432 192.168.2.100。
添加 -g 参数(switch)允许其他主机利用您的转发连接,这使得连接成为了专门用于 Postgres 连接的即时虚拟专有网(VPN):ssh -g -L 10000:localhost:5432 192.168.2.100.
有关隧道的一些注意事项:
?数据库客户机和服务器都被认为它们正在与各自的本地主机通信。
?注意要配置文件 pg_hba.conf 以使用 TCP/IP 为本地主机连接设置正确的身份验证。
?1024 以内的端口全部由根用户控制。
?SSH 会话需要在 PostgreSQL/SSH 服务器上有一个已有的用户帐户。
由 SSL 加密的会话
PostgreSQL 中的加密会话要求服务器通过 --with-openssl 参数进行编译。Linux 发行版二进制文件提供了这个功能。诸如 psql 和 pgadmin 之类的客户机也具有这类必需的功能。
可以使用 pg_config 命令行工具对服务器进行检验,如下所示。
pg_config --configure
针对加密会话配置 PostgreSQL 服务器:
1.使用 OpenSSL 命令行工具 openssl 创建一个自签名的服务器密匙(server.key)和证书(server.crt)。
1.创建服务器密匙:openssl genrsa -des3 -out server.key 1024。
2.删除密码 openssl rsa -in server.key -out server.key。
3.为服务器创建一个自签名的证书:openssl req -new -key server.key -x509 -out server.crt。
2.将 server.key 和 server.crt 这两个文件安装到数据集群的目录中。
3.编辑 postgresql.conf 文件并设置指定的对:ssl = on。
4.重启服务器。
清单 23. 成功的 SSL 加密会话连接
robert@wolf:~$ psql -h 192.168.2.100 -U robertWelcome to psql 8.2.4, the PostgreSQL interactive terminal.Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quitSSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)robert=#
服务器将始终针对已加密的会话请求测试连接。然而,通过编辑身份验证文件 pg_hba.conf,您可以控制服务器的行为。在客户机端,可以通过定义环境变量 PGSSLMODE 来控制客户机(psql)的默认行为:是否使用加密的会话。
共有 6 种模式(其中两种新模式特别针对 V8.4)。
模式 描述
disable 将只尝试未加密的 SSL 连接。
allow 首先尝试未加密的连接,如果不成功,则尝试 SSL 连接。
prefer 与 allow 模式相反;首先尝试 SSL 连接,然后尝试未加密连接。
require 客户机只尝试已加密的 SSL 连接。
verify-ca SSL 连接,并且具有由可信 CA 签发的有效客户机证书。
Verify-full SSL 连接,具有由可信 CA 签发的有效客户机证书,并且服务器主机名匹配证书的主机名。
例如:导出 PGSSLMODE=prefer.
SSL 证书
SSL 身份验证是指客户机和服务器交换由具有可靠凭证的第三方签发的证书。这个第三方被称为证书权威(CA)。如果客户机或服务器不能从另一方接收到合法的证书,那么连接将被拒绝。
尽管涉及许多细节,但是在 PostgreSQL 上使用 SSL 证书设置身份验证非常简单:
1.编辑 postgresql.conf,ssl=on。 服务器端身份验证要求下面的文件必须位于其数据集群中:
?server.key
?server.crt(必须由 CA 签发)
?root.crt(检验客户机身份验证)
?root.crl(证书撤销列表,可选)
文件 root.crt 包含一个经过检验的证书列表。其中应该包含可用于您的特定发行版的所有证书,您也可以向该文件中添加证书。
文件 root.crl 类似于 root.crt,因为它包含一组经过 CA 签名的证书。然而,这些证书属于已被撤销了连接权的客户机。一个空的 root.crl 文件不会影响身份验证过程。