如何允许PostgreSQL远程连接
安装PostgreSQL后,我们可以在没有密码的情况下使用Postgres系统用户在本地登录服务器。
但是,我们不允许从远程计算机连接到服务器。
也就是说,默认情况下,PostgreSQL不允许远程连接到服务器。
运行'ss -tlnp'命令,我们将看到postgres进程仅在'127.0.0.1'IP地址(localhost)上侦听。
允许远程连接是两步过程
步骤01:首先更改listens_addresses,我们需要在“postgresql.conf”中更改“lists_addresses”选项,主配置文件。
默认情况下,PostgreSQL仅在“localhost”上侦听,这意味着我们只能在本地连接到服务器。
PostgreSQL服务器的此行为由“postgresql.conf”的“listen_addresses”指令控制。
在Ubuntu中,如果我们正在运行PostgreSQL 13,则主配置文件的位置是'/etc/postgresql/13/main/postgresql.conf'。
步骤02:配置基于主机的访问控制之后,我们应该将主机记录添加到“pg_hba.conf”文件(基于主机的身份验证文件),以允许访问远程计算机。
“pg_hba.conf”文件中的主机条目用于指定允许连接到PostgreSQL服务器的主机。
在Ubuntu中,'pg_hba.conf'文件与postgresql.conf文件相同的目录。
更改listence_addresses.
打开“postgreSQL.conf”并找到“listen_addresses”的行:
#listen_addresses = 'localhost'
将其更改为如下:
listen_addresses = '*'
如果注释(行开头有'#'符号),请删除哈希符号。
更改'listen_addresses'设置后,它需要重新启动PostgreSQL服务:
systemctl restart postgresql
配置基于主机的访问控制
配置“listen_addresses”后,我们可以继续下一步。
这是将主机条目添加到“pg_hba.conf”文件。
'pg_hba.conf'文件在PostgreSQL服务器和客户端计算机(本地和远程)之间管理客户端身份验证。
它允许我们定义允许谁连接到计算机上的数据库,如防火墙。
connection_type database user address auth_method
例如,如果将以下条目添加到主机部分,它将允许从“192.168.1.200”IP地址的远程连接,使用Postgres用户而无需密码。
host all postgres 192.168.1.200/32 trust
更改'pg_hba.conf'需要PostgreSQL服务重载:
systemctl reload postgresql
信任身份验证方法允许Postgres系统用户在没有密码的情况下登录服务器。
它适用于Linux,Ubuntu和CentOS,但不适用于Windows。
连接到服务器时,客户端需要从远程计算机指定服务器IP地址(或者主机名)和用户名:
psql -h 192.168.1.100 --username postgres
以下主机记录允许“192.168.1.0/24”网络中的任何计算机连接到任何数据库作为Postgres用户,而无需使用密码。
host all postgres 192.168.1.0/24 trust
如果要允许从任何位置的连接,请在地址部分中放置“0.0.0/0”。
host all postgres 0.0.0.0/0 trust
在'pg_hba.conf'文件事项中输入主机记录的顺序。
对于给定的主机,Postgres将使用匹配的第一个规则。
如果添加的新规则不起作用,请将其放在列表的顶部以查看它是否有效。
密码身份验证
在前面的示例中,我们允许Postgres超级用户使用“信任”身份验证方法连接到服务器而无需密码。
但是,没有密码连接不是远程访问的最佳选择。
相反,我们应该使用密码身份验证方法,“Scram-Sha-256”(推荐)或者“MD5”。
在以下示例中,我们将创建一个名为营销和名为Admin1的数据库用户的新数据库。
并允许Admin1用户连接到营销数据库,但只能使用具有“MD5”密码身份验证的IPv4地址的远程计算机。
首先,创建用户和数据库:
CREATE ROLE admin1 WITH LOGIN PASSWORD 'mypassword'; CREATE DATABASE marketing WITH owner = admin1;
将以下主机记录添加到“pg_hba.conf”:
host marketing admin1 192.168.1.200/32 md5
重新加载Postgres服务:
systemctl reload postgresql
admin1用户现在可以使用密码从“192.168.1.200”主机连接到服务器。
psql -h 192.168.1.100 -U admin1 -d marketing
在前面的示例中,Admin1用户被限制在marketing数据库。