使用pgadmin远程连接 greenplum 时,出现Unable to connect to server: FATAL: no pg_hba.conf entry for host “xxx.xxx.xx.xxx”, user “postgres”, database “postgres” 的问题。
原因:
PostgreSQL数据库为了安全,它不会监听除本地以外的所有连接请求,当用户通过jdbc或者客户端软件去远程访问时,就会报出此问题。
客户端访问和认证受到配置文件pg_hub.conf(标准的PostgreSQL基于主机认证文件)的控制。
在Greenplun数据库中,Master实例的pg_hba.conf 文件控制着对Greenplum系统的客户端访问和认证。Segment也有自己的pg_hba.conf 文件,但是它们已经被正确地配置为仅允许来自Master主机的客户端连接。Segment从不接收外部的客户端连接,因此没有修改Segment上的pg_hba.conf 文件。
解决办法:
只需要找到master安装目录下的pg_hba.conf,例如:
/home/gpadmin/masterdata/gpesg-1
添加 :
host all all 0/0 trust
修改完之后,重启greenplum。
这样就可以让任意的ip地址去访问任意的数据库。
pg_hba.conf文件详解:
pg_hba.conf 文件的一般格式是一组记录,每个记录一行。空行会被忽略,任何#号注释字符之后的文本也同样会被忽略。记录由若干个被空格或者制表符分隔的域构成。
如果值域被加上引号,其中可以包含空格。记录不能跨行。每个远程客户端记录访问都是如下格式:
host database role CIDR-address authentication-method
每个UNIX域套接字访问记录时如下格式:
local database role authentication-method
pg_hba.conf域的含义如下:
TYPE:
定义了多种连接PostgreSQL的方式,分别是:
local 匹配使用UNIX域套接字的连接尝试。如果没有这类记录,就不允许UNIX域套接字连接。
host 匹配使用TCP/IP的连接尝试,但是只匹配使用SSL加密建立的链接。SSL必须在服务器启动时通过设置ssl配置参数来启用。对SSL认证的要求可以在postgresql.conf中配置。见为SSL认证配置postgresql.conf。
"host" 结合“IPv4地址”使用IPv4方式,结合"IPv6地址" 则使用IPv6方式,
hostssl 匹配使用TCP/IP的连接尝试,但是只匹配使用SSL加密建立的连接。SSL必须在服务器启动时通过设置ssl配置参数来启用。对SSL认证的要求可以在postgresql.conf中配置。为SSL认证配置postgresql.conf 。
hostnossl 匹配使用TCP/IP但不用SSL的连接尝试。对SSL认证的要求可以在postgresql.conf中配置。见 为SSL认证配置postgresql.conf。
DATABASE:
指定这个记录匹配哪些数据库名。值all指定它匹配所有数据库。通过用逗号分隔数据库名,可以提供多个数据库名。可以指定一个包含数据库名的单独文件,方法是在这个域中给出加上前缀@的文件名。“all”只有在没有其他的符合条目时才代表“所有”,如果有其他的符合条目则代表“除了该条之外的”,因为“all”的优先级最低。如下例:
local db1 user1 reject
local all all ident
这两条都是指定local访问方式,因为前一条指定了特定的数据库db1,所以后一条的all代表的是除了db1之外的数据库,同理用户的all也是这个道理。
ROLE:
指定这个记录匹配哪些数据库角色名。值all指定它匹配所有角色。如果指定的角色是一个组并且想包括其中的所有成员,可在角色名前面放一个+。通过用逗号分隔角色名,可以提供多个角色名。可以指定一个包含角色名的单独文件,方法是在这个域中给出加上前缀@的文件名。
CIDR-ADDRESS
指定这个记录匹配的客户端机器IP地址范围。它包含一个标准点分十进制记法的IP地址和一个CIDR掩码长度。IPD地址只能用数字形式指定,不能作为域名或者主机名指定。掩码长度表明客户端IP地址必须匹配的高位二进制位数。给定IP地址中在这一长度右边的二进制位必须为零。在IP地址、/、CIDR掩码长度之间不能有任何空格。
CIDR地址的典型例子有:172.20.143.89/32是单台主机,172.20.143.0/24是一个小型网络,10.6.0.0/16是一个大型网络。要指定单台主机,对于IPv4和IPv6分别使用CIDR掩码32和128.在网络地址中,不要省略拖尾的零。
CIDR-ADDRESS项local方式不必填写,该项可以是IPv4地址或IPv6地址,可以定义某台主机或某个网段。
IP-地址
IP-掩码
这些域可以被用作CIDR-地址记法的替换选择。与指定掩码长度不同,真实的掩码在一个单独的列中指定。例如,255.0.0.0表示一个IPv4的CIDR掩码长度8,而255.255.255.255表示CIDR掩码长度32.这些域只适用于host、hostssl以及hostnossl记录
authentication-method:
指定如何处理客户端的认证。常用的有ident,md5,password,trust,reject。
ident 基于客户端的操作系统用户名的认证。用户只用该本地连接使用这种方法。是Linux下PostgreSQL默认的local认证方式,凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。 用户映射文件为pg_ident.conf,这个文件记录着与操作系统用户匹配的数据库用户, 如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。比如,服务器上有名为user1的操作系统用户,同时数据库上也有同名的数据库用户,user1登录操作系统后可以直接输入psql,以user1数据库用户身份登录数据库且不需密码。
很多初学者都会遇到psql -U username登录数据库却出现“username ident 认证失败”的错误,明明数据库用户已经createuser。原因就在于此,使用了ident认证方式,却没有同名的操作系统用户或没有相应的映射用户。
解决方案:
1、在pg_ident.conf中添加映射用户;
2、改变认证方式。
md5 是常用的密码认证方式,要求客户端提供MD5加密的密码进行身份验证,如果你不使用ident,最好使用md5。密码是以md5形式传送给数据库,较安全,且不需建立同名的操作系统用户。
password 是以明文密码传送给数据库,由于密码是通过网络以明文形式发送的,因此不应在不受信任的网络上使用该密码,建议不要再生成环境中使用。传输过程中应该总是使用SSL连接防止口令嗅探,这是可配置的。
trust 是只要知道数据库用户名就不需要密码或ident就能登录,建议不要再生成环境中使用。获取客户端的操作系统用户名(对于TCP / IP连接,请通过与客户端上的ident服务器联系,对于本地连接则是通过从操作系统获取),并检查其是否与请求的数据库用户名匹配。
reject 无条件拒绝连接。这对于 从组中“过滤”某些主机很有用,例如拒绝可能阻止特定主机连接,而更高的行允许特定网络中的其余主机连接。用户通常应该使用这种方法来限制来自特定主机或者不安全连接的访问。
gss 使用GSSAPI对用户进行身份验证。这仅适用于TCP / IP连接。
sspi 使用SSPI对用户进行身份验证。仅在Windows上可用。
krb5 使用Kerberos V5对用户进行身份验证。这仅适用于TCP / IP连接。
用户可以用一台Kerberos服务器(RFC 2743, 1964)认证。
pg_hba.conf文件中Kerberos认证的格式是:
servicename/hostname@realm
可以把下列选项加到该项中:
Map
映射系统和数据库用户。
Include_realm
在ident映射文件中指定系统用户名中包括的realm名称的选项。
Krb_realm
为匹配的主体指定realm名称。
Krb_server_hostname
服务主体的主机名。
下面是一个pg_hba.conf的Kerberos项的例子:
host all all 0.0.0.0/0 krb5
hostssl all all 0.0.0.0/0 krb5 map=krbmap
下列Kerberos服务器设置在postgresql.conf中被指定:
krb_server_key file
设置Kerberos服务器密钥文件的位置。
krb_srvname string
Kerberos服务名。
krb_caseins_users boolean
大小写敏感性。默认为off。
下面的客户端设置作为连接参数被指定:
Krbsrvname
要用于认证的Kerberos服务名。
ldap 使用LDAP服务器进行身份验证。
radius 使用RADIUS服务器进行身份验证。
cert 使用SSL客户端证书进行身份验证。
pam 使用操作系统提供的可插拔身份验证模块(PAM)服务进行身份验证。有关详细信息,
举些例子
本地使用psql登录数据库,是以unix套接字的方式,符合local方式。
使用PGAdmin3或php登录数据库,不论是否本地均是以TCP/IP方式,附合host方式。如果是本地(数据库地址localhost),CIDR-ADDRESS则为127.0.0.1/32。
例:
1、允许本地使用PGAdmin4登录数据库,数据库地址localhost,用户user1,数据库user1db:
host user1db user1 127.0.0.1/32 md5
2、允许10.1.1.0~10.1.1.255网段登录数据库:
host all all 10.1.1.0/24 md5
3、信任192.168.1.10登录数据库:
host all all 192.168.1.10/32 trust
4、信任任意用户任意网段登录任意数据库:
host all all 0/0 trust
pg_hba.conf修改后,使用gpstop -u 重新读取pg_hba.conf文件。
另:PostgreSQL默认只监听本地端口,用netstat -tuln只会看到“tcp 127.0.0.1:5432 LISTEN”。修改postgresql.conf中的listen_address=*,监听所有端口,这样远程才能通过TCP/IP登录数据库,用netstat -tuln会看到“tcp 0.0.0.0:5432 LISTEN”。