通过Unix套接字将DBeaver连接到远程PostgreSQL DB

时间:2020-07-04 18:55:49

标签: postgresql ssh unix-socket dbeaver

我最近在Windows PC上安装了https://dbeaver.io/,希望从中访问远程Linux服务器上的数据库。

我的Linux用户名是my_username,我也有一个系统用户psql_user。我也有两个现有的PostgreSQL数据库,它们的名称与各自的用户相同。通常,只有psql_user被使用,并且被php-fpm池访问,侦听Unix套接字并以psql_user用户身份运行,因此将/var/lib/pgsql/12/data/pg_hba.conf配置为:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
host    all             all             127.0.0.1/32            ident
host    all             all             ::1/128                 ident
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

通过上述配置,在登录到服务器后,我可以通过执行psql访问my_username数据库,也可以通过执行sudo -u psql_user psql访问psql_user数据库,不需要使用密码之一。

但是现在,如何从远程Windows PC连接?

为此,我首先在Windows PC上为my_username和psql_user创建了不带口令的ssh密钥,并将公用密钥添加到每个Linux用户的authorized_keys中(由于它是一个系统,因此必须手动创建/home/psql_user/用户)。我可以使用ssh键成功将PuTTY粘贴到服务器。

接下来,在DBeaver连接设置SSH选项卡上,我选中了“使用SSH隧道”,输入了用户名和私钥位置,Test tunnel configuration已成功显示与客户端版本的连接为SSH-2.0-JSCH-01.54服务器版本为SSH-2.0-OpenSSH_7.4。我还没有更改此选项卡的“高级”部分,例如本地和远程主机和端口,并且也将“可以在SSH参数中使用变量”保留为其默认值。

使用主选项卡“身份验证”中的“数据库本机”中的服务器IP,并保留密码为空,我测试了连接,但得到The connection attempt failed.的系统日志报告,与端口5432上IP的连接失败,这是有道理的,因为是使用Unix套接字设置的。

因此,然后我将主选项卡上的服务器IP更改为127.0.0.1(或localhost),然后重试,但得到FATAL: Ident authentication failed for user "my_username"。好的,再靠近一点,但不完全是那边。

我认为可能是因为DBeaver正在传递端口,所以我尝试通过进入“编辑驱动程序”选项卡并将jdbc:postgresql://{host}[:{port}]/[{database}]更改为jdbc:postgresql://{host}/[{database}]来禁用此部分,但是现在获得了Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections

不确定下一步要去哪里。当我将PuTTY插入Linux机器时,一切都很好,但是使用DBeaver进行远程连接时就不好了,并认为如果我使用SSH将DBeaver连接到服务器也是如此。如何做到这一点?

2 个答案:

答案 0 :(得分:0)

虽然我认为可以将ssh隧道设置为连接到unix套接字而不是端口,但dbeaver并没有提供这样做的方法,因此您必须单独设置它。

尽管如果服务器运行identd服务,ident也应该起作用。我认为大多数linux默认情况下都不这样做,但是只要apt install oidentd或您的程序包管理器上的任何等效命令都可以解决此问题。

更简单的解决方案是将方法从ident更改为md5或scram,然后分配一个密码(dbeaver提供用于记忆)。

答案 1 :(得分:0)

如另一个答案中所指出的那样,DBeaver的SSH隧道选项当前不支持套接字。它始终基于TCP端口,因此只能使用pg_hba.conf中的// somewhere outside your handler/function let reviewed = false; // inside if(scrollAmount > documentHeight*0.3 && !PassedValue && !reviewed) { reviewed = true; // your logic here } 选项进行连接(我在DBeaver中放置了feature request用于SSH套接字转发)。

这是设置本地TCP端口到远程Unix套接字的转发的方法。这使您可以在Unix套接字上使用host身份验证,因此不必为PostgreSQL角色提供密码:

peer