配置客户端认证
上级主题:
客户端访问和认证受到配置文件pg_hba.conf(标准的PostgreSQL基于主机认证文件)的控制。有关该文件的详细信息请见PostgreSQL文档中的pg_hba.conf文件。
在Greenplum数据库中,Master实例的pg_hba.conf文件控制着对Greenplum系统的客户端访问和认证。Segment也有自己的pg_hba.conf文件,但是它们已经被正确地配置为仅允许来自Master主机的客户端连接。Segment从不接受外部的客户端连接,因此没有必要修改Segment上的pg_hba.conf文件。
pg_hba.conf文件的一般格式是一组记录,每个记录一行。空行会被忽略,任何#号注释字符之后的文本也同样会被忽略。记录由若干个被空格或者制表符分隔的域构成。如果域值被加上引号,其中可以包含空格。记录不能跨行。每个远程客户端访问记录都是如下格式:
每个UNIX域套接字访问记录是如下格式:
pg_hba_conf域的含义如下:
local
匹配使用UNIX域套接字的连接尝试。如果没有这类记录,就不允许UNIX域套接字连接。
host
匹配使用TCP/IP的连接尝试。除非服务器使用服务器配置参数listen_addresses的合适值启动,远程TCP/IP连接将不可能成功。
hostssl
匹配使用TCP/IP的连接尝试,但是只匹配使用SSL加密建立的连接。SSL必须在服务器启动时通过设置ssl配置参数来启用。对SSL认证的要求可以在postgresql.conf中配置。见。
hostnossl
匹配使用TCP/IP但不用SSL的连接尝试。对SSL认证的要求可以在postgresql.conf中配置。见为SSL认证配置postgresql.conf。
database
指定这个记录匹配哪些数据库名。值all指定它匹配所有数据库。通过用逗号分隔数据库名,可以提供多个数据库名。可以指定一个包含数据库名的单独文件,方法是在这个域中给出加上前缀@的文件名。
role
指定这个记录匹配哪些数据库角色名。值all指定它匹配所哟角色。如果指定的角色是一个组并且想包括其中的所有成员,可在角色名前面放一个+。通过用逗号分隔角色名,可以提供多个角色名。可以指定一个包含角色名的单独文件,方法是在这个域中给出加上前缀@的文件名。
CIDR-地址
指定这个记录匹配的客户端机器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.在网络地址中,不要省略拖尾的零。
IP-地址
IP-掩码
这些域可以被用作CIDR-地址记法的替换选择。与指定掩码长度不同,真实的掩码在一个单独的列中指定。例如,255.0.0.0表示一个IPv4的CIDR掩码长度8,而255.255.255.255表示CIDR掩码长度32.这些域只适用于host、hostssl以及hostnossl记录
authentication-method
指定连接时要使用的认证方法。详见。
编辑pg_hba.conf文件
这个例子展示如何编辑Master的pg_hba.conf文件来允许对从所有角色访问所有数据库的远程客户端使用加密口令认证。
注意: 对于一个更安全的系统,考虑从Master的pg_hba.conf中移除所有使用trust认证的连接。trust认证意味着不做任何认证就授予角色访问,因此会绕过所有安全性。如果系统具有可用的ident服务,可以把trust项替换为ident认证。
要编辑pg_hba.conf:
- 在一个文本编辑器中打开文件$MASTER_DATA_DIRECTORY/pg_hba.conf。
为想要允许的每一类连接在文件中增加一行。记录会被顺序读取,因此记录的顺序是有意义的。通常,较早出现的记录将有比较严格的连接匹配参数以及较弱的认证方法,而较晚出现的记录将有较宽松的匹配参数和较强的认证方法。例如:
# 允许gpadmin用户使用ident认证本地访问所有数据库
local all gpadmin ident sameuser
host all gpadmin 127.0.0.1/32 ident
host all gpadmin ::1/128 ident
# 允许'dba'角色从任何具有IP地址192.168.x.x的主机访问任何数据库
# 并且是用md5加密的口令来认证用户
host all dba 192.168.0.0/32 md5
支持下列基本认证方法:
password或者md5
要求客户端提供一个口令,可以为两种之一:
- md5 – 口令作为MD5哈希传输。
- password – 口令以明文传输。传输过程中应该总是使用SSL连接来防止口令嗅探。这是可配置的,更多信息请见Greenplum数据库管理员指南中的“加密口令”。
reject
拒绝有匹配参数的连接。用户通常应该使用这种方法来限制来自特定主机或者不安全连接的访问。
ident
基于客户端的操作系统用户名的认证。用户只用该对本地连接使用这种方法。
下面是pg_hba.conf基本认证项的一些例子:
hostnossl all all 0.0.0.0 reject
local all gpuser ident
Kerberos认证
用户可以用一台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
krb_server_key file
设置Kerberos服务器密钥文件的位置。
krb_srvname string
Kerberos服务名。
krb_caseins_users boolean
大小写敏感性。默认为off。
下面的客户端设置作为连接参数被指定:
Krbsrvname
要用于认证的Kerberos服务名。
LDAP认证
用户可以用一个LDAP目录认证。
- LDAPS和TLS上的LDAP选项可以加密到LDAP服务器的连接。
- 除非SSL被启用,从客户端到服务器的连接不会被加密。配置客户端连接以使用SSL加密来自该客户端的连接。
- 要配置或者自定义LDAP设置,将LDAPCONF环境变量设置为到ldap.conf文件的路径并且将它加入到greenplum_path.sh脚本。
下面是为用户系统配置LDAP认证的推荐步骤:
- 用要通过LDAP认证的数据库用户/角色设置LDAP服务器。
- 在数据库上:
- 验证要通过LDAP认证的数据库用户存在于数据库上。LDAP仅被用于验证用户名/口令对,因此角色应该存在于数据库中。
- 更新$MASTER_DATA_DIRECTORY中的pg_hba.conf文件为相应的用户使用LDAP作为认证方法。注意pg_hba.conf文件中第一个匹配用户/角色的项将被用作认证机制,因此项在该文件中的位置很重要。
- 重载服务器让pg_hba.conf配置设置生效(gpstop -u)。
在auth-options中指定下面的参数。
ldapserver
要连接的LDAP服务器的名称或者IP地址。可以指定多个服务器,用空格分隔。
ldapprefix
在做简单绑定认证时,形成要绑定为的DN时自动加在用户名前面的字符串。
ldapsuffix
在做简单绑定认证时,形成要绑定为的DN时自动加在用户名后面的字符串。
ldapport
要连接的LDAP服务器上的端口号。如果没有指定端口,将使用LDAP库的默认端口设置。
ldaptls
设置为1让PostgreSQL和LDAP服务器之间的连接是用TLS加密。注意这只加密到LDAP服务器的流量 — 到客户端的连接仍将是未加密的(除非使用了SSL)。
ldapbasedn
在做搜索+绑定认证时,要开始在其中搜索用户的根DN。
ldapbinddn
在做搜索+绑定认证时,绑定到目录以执行搜索的用户的DN。
ldapbindpasswd
在做搜索+绑定认证时,绑定到目录以执行搜索的用户的口令。
ldapsearchattribute
在做搜索+绑定认证时,匹配正在搜索的用户名的属性。
示例:
下面是LDAP认证的pg_hba.conf文件项的例子:
host all testuser 0.0.0.0/0 ldap ldap
ldapserver=ldapserver.greenplum.com ldapport=389 ldapprefix="cn=" ldapsuffix=",ou=people,dc=greenplum,dc=com"
hostssl all ldaprole 0.0.0.0/0 ldap
ldapserver=ldapserver.greenplum.com ldaptls=1 ldapprefix="cn=" ldapsuffix=",ou=people,dc=greenplum,dc=com"
SSL客户端认证
SSL认证将正在连接的客户端在SSL握手期间提供的SSL证书的公用名(cn)属性与被请求的数据库用户名进行比较。数据库用户应该在数据库中存在。映射文件可以被用来在系统用户名和数据库用户名之间进行映射。
认证方法:
Cert
认证选项:
Hostssl
连接类型必须是hostssl。
map=mapping
映射。
这在pg_ident.conf文件中被指定,或者在ident_file服务器设置中指定的文件中指定。
下面是SSL客户端认证的pg_hba.conf项的例子:
Hostssl testdb certuser 192.168.0.0/16 cert
OpenSSL配置
Greenplum数据库默认会读取$GP_HOME/etc/openssl.cnf中指定的OpenSSL配置文件。用户可以通过修改或者更新这个文件并且重启服务器对OpenSSL的默认配置做更改。
创建一个自签名证书
自签名证书可以被用来测试,但是生产中应该使用由证书颁发机构(CA)(全球CA或者本地CA)签发的证书,这样客户端就能够验证服务器的身份。如果所有的客户端都是组织本地的,推荐使用本地CA。
要为服务器创建一个自签名证书:
输入下列openssl命令:
openssl req -new -text -out server.req
这个程序生成受口令保护的密钥,它不接受短于四字符的口令。要移除口令(如果想让服务器自动启动还必须移除),运行下面的命令:
openssl rsa -in privkey.pem -out server.key rm privkey.pem
输入旧口令解锁现有的密钥。然后输入下面的命令:
openssl req -x509 -in server.req -text -key server.key -out server.crt
最后,运行下列命令:
更多如何创建服务器私钥和证书的细节,请参考OpenSSL的文档。
下面的服务器设置需要在postgresql.conf配置文件中被指定:
- ssl boolean。启用SSL连接。
- ssl_renegotiation_limit integer。指定密钥重新协商之前的数据限制。
- ssl_ciphers string。列出允许的SSL加密算法。
下列SSL服务器文件可以在Master的数据目录下找到:
- server.crt。服务器证书。
- server.key。服务器私钥。
- root.crt。可信的证书机构。
- root.crl。被证书机构撤销的证书。
配置SSL客户端连接
SSL选项:
require
仅使用SSL连接。如果存在一个根CA文件,以指定verify-ca时同样的方式验证证书。
verify-ca
仅使用SSL连接。验证服务器证书由一个可信的CA发出。
verify-full
仅使用SSL连接。验证服务器证书由一个可信的CA发出并且该服务器主机名匹配证书中的名称。
sslcert
客户端SSL证书的文件名。默认是~/.postgresql/postgresql.crt。
sslkey
用于客户端证书的密钥。默认是~/.postgresql/postgresql.key。
sslrootcert
包含SSL证书机构证书的文件名。默认是~/.postgresql/root.crt。
sslcrl
SSL证书撤销列表的名称。默认是~/.postgresql/root.crl。
客户端连接参数可以使用下列环境变量设置:
- sslmode – PGSSLMODE
- sslkey – PGSSLKEY
- sslrootcert – PGSSLROOTCERT
- sslcert – PGSSLCERT
- sslcrl – PGSSLCRL
“PAM”(可插拔认证模块)被用来验证用户名/口令对,类似于基本认证。PAM认证只在用户已经在数据库中存在时才有用。
参数
pamservice
默认的PAM服务是postgresql。注意如果PAM被设置为读取/etc/shadow,认证将会失败因为PostgreSQL服务器由一个非根用户启动。
下面是PAM客户端认证的pg_hba.conf项的例子:
local all gpuser am pamservice=postgresql
Radius认证
RADIUS(远程认证拨号用户服务)认证通过向一台配置好的RADIUS服务器发送’Authenticate Only’类型的Access Request消息工作。它包括用于用户名、口令(加密)以及网络访问服务器(NAS)标识符的参数。这个请求使用由radiussecret选项中指定的共享秘密加密。RADIUS服务器会响应Access Accept或者Access Reject。
注意: 不支持RADIUS计费。
只有用户已经在数据库中存在时,RADIUS认证才有用。
为了强密码,RADIUS加密向量要求SSL被启用。
radiusserver
RADIUS服务器的名称。
radiussecret
RADIUS共享秘密。
radiusport
RADIUS服务器上要连接的端口。
radiusidentifier
RADIUS请求中的NAS标识符。
下面是RADIUS客户端认证的pg_hba.conf项的例子:
hostssl all all 0.0.0.0/0 radius radiusserver=servername radiussecret=sharedsecret
要限制对Greenplum数据库系统的活动并发会话的数量,用户可以配置max_connections服务器配置参数。这是一个本地参数,意味着用户必须在Master、后备Master和每个Segment实例(主Segment和镜像Segment)的postgresql.conf文件中设置它。Segment上max_connections的值必须是Master上该值的5-10倍。
在用户设置max_connections时,还必须设置依赖参数max_prepared_transactions。在Master上,这个值必须被设置为至少和max_connections值一样大,而在Segment实例上应该设置为和Master上一样的值。
在$MASTER_DATA_DIRECTORY/postgresql.conf(包括后备Master)中:
max_connections=100
max_prepared_transactions=100
在所有Segment实例的SEGMENT_DATA_DIRECTORY/postgresql.conf中:
max_connections=500
max_prepared_transactions=100
注意: 调高这些参数的值可能会导致Greenplum数据库请求更多共享内存。为了缓和这种影响,考虑降低其他内存相关的参数,例如gp_cached_segworkers_threshold。
要更改允许的连接数:
停止Greenplum数据库系统:
在Master主机上,编辑$MASTER_DATA_DIRECTORY/postgresql.conf并且更改下面两个参数:
- max_connections – 想要允许的活动用户会话数加上superuser_reserved_connections的数量。
- max_prepared_transactions – 必须大于等于max_connections。
- 在每个Segment实例上,编辑SEGMENT_DATA_DIRECTORY/postgresql.conf并且更改下面两个参数:
- max_connections – 必须是Master上值的5-10倍。
- max_prepared_transactions – 必须等于Master上的值。
重启Greenplum数据库系统:
加密客户端/服务器连接
Greenplum数据库对于客户端和Master服务器之间的SSL连接有原生支持。SSL连接可以防止第三方进行包嗅探,还能防止中间人攻击。只要客户端连接会通过不安全的链接,就应该使用SSL,并且只要使用客户端证书认证也应该使用SSL。
注意: 有关在gpfdist服务器和Greenplum数据库Segment主机之间加密数据的信息,请见加密gpfdist连接。
启用SSL要求在客户端和Master服务器系统上都安装OpenSSL。可通过在Master的postgresql.conf中设置服务器配置参数ssl=on让Greenplum以启用SSL的方式启动。在以SSL模式启动时,服务器将在Master的数据目录中查找server.key(服务器私钥)文件和server.crt(服务器证书)文件。在启用SSL的Greenplum系统能启动之前,这些文件必须被正确地设置好。
重要: 不要用口令保护私钥。服务器不会为私钥提示要求口令,而不提供口令数据库启动会失败并且报出错误。