配置客户端认证

配置客户端认证

描述认证Greenplum数据库客户端的可用方法。

在Greenplum数据库系统第一次被初始化时,系统含有一个预定义的超级用户角色。这个角色将具有与初始化该Greenplum数据库系统的操作系统用户相同的名称。这个角色被称作gpadmin。默认情况下,系统被配置为只允许来自gpadmin角色的对数据库的本地连接。如果用户想要允许任

允许到Greenplum数据库的连接

客户端访问和认证受到配置文件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文件的一般格式是一组记录,每个记录一行。空行会被忽略,任何#号注释字符之后的文本也同样会被忽略。记录由若干个被空格或者制表符分隔的域构成。如果域值被加上引号,其中可以包含空格。记录不能跨行。每个远程客户端访问记录都是如下格式:
host   database   role   address   authentication-method
每个UNIX域套接字访问记录是如下格式:
local   database   role   authentication-method
pg_hba.conf域的含义如下:
local
匹配使用UNIX域套接字的连接尝试。如果没有这类记录,就不允许UNIX域套接字连接。
host
匹配使用TCP/IP的连接尝试。除非服务器使用服务器配置参数listen_addresses的合适值启动,远程TCP/IP连接将不可能成功。
hostssl
匹配使用TCP/IP的连接尝试,但是只匹配使用SSL加密建立的连接。SSL必须在服务器启动时通过设置ssl配置参数来启用。对SSL认证的要求可以在postgresql.conf中配置。见为SSL认证配置postgresql.conf.
hostnossl
匹配使用TCP/IP但不用SSL的连接尝试。对SSL认证的要求可以在postgresql.conf中配置。见为SSL认证配置postgresql.conf.
database
指定这个记录匹配哪些数据库名。值all指定它匹配所有数据库。通过用逗号分隔数据库名,可以提供多个数据库名。可以指定一个包含数据库名的单独文件,方法是在这个域中给出加上前缀@的文件名。
role
指定这个记录匹配哪些数据库角色名。值all指定它匹配所哟角色。如果指定的角色是一个组并且想包括其中的所有成员,可在角色名前面放一个+。通过用逗号分隔角色名,可以提供多个角色名。可以指定一个包含角色名的单独文件,方法是在这个域中给出加上前缀@的文件名。
address
指定这个记录匹配的客户端机器地址。该字段可以包含IP地址,IP地址范围或主机名。
IP地址范围是使用标准点分指定范围的起始地址,然后是斜杠(/)和CIDR掩码长度。掩码长度表明客户端IP地址必须匹配的高位二进制位数。给定IP地址中在这一长度右边的二进制位必须为零。在IP地址、/、CIDR掩码长度之间不能有任何空格。
IPv4地址范围的典型例子有 172.20.143.89/32 是单台主机, 或 172.20.143.0/24 是一个小型网络, 或 10.6.0.0/16 是一个大型网络. 对于单个主机,IPv6地址范围可能类似于::1/128(在本例中为IPv6环回地址)或fe80::7a31:c1ff:0000:0000/96用于小型网络。 0.0.0.0/0 代表所有IPv4地址, ::0/0 代表所有IPv6地址。要指定单台主机,对于IPv4和IPv6分别使用CIDR掩码32和128.在网络地址中,不要省略拖尾的零。
以IPv4格式给出的条目将仅匹配IPv4连接,以IPv6格式给出的条目将仅匹配IPv6连接,即使所表示的地址在IPv4-in-IPv6范围内。
Note: 如果主机系统C库不支持IPv6地址,则IPv6格式的条目将被拒绝。
如果指定了主机名(将非IP地址或IP范围的地址视为主机名),则将该名称与反向名称的结果进行比较客户端IP地址的分辨率(例如,如果使用DNS,则为反向DNS查找)。 主机名比较不区分大小写。 如果匹配,则转发名称对主机名执行解析(例如,正向DNS查找)以检查其解析为的地址是否等于客户端IP地址。如果两个方向都匹配,则认为该条目匹配。
某些主机名数据库允许将IP地址与多个主机名相关联,但是当要求系统解析IP时,操作系统仅返回一个主机名地址。pg_hba.conf中使用的主机名必须是客户端IP地址的地址到名称解析返回的主机名,否则行将不被视为匹配项。
pg_hba.conf 中指定了主机名时,应确保名称解析相当快。设置本地名称解析缓存(例如nscd)可能是有利的。另外,用户可以启用服务器配置参数log_hostname以查看客户端主机名而不是日志中的IP地址。
IP-地址
IP-掩码
这些域可以被用作CIDR-地址记法的替换选择。与指定掩码长度不同,真实的掩码在一个单独的列中指定。例如,255.0.0.0表示一个IPv4的CIDR掩码长度8,而255.255.255.255表示CIDR掩码长度32。
authentication-method
指定连接时要使用的认证方法。详见 认证方法
CAUTION:
对于一个更安全的系统,考虑从Master的pg_hba.conf中移除所有使用trust认证的连接。trust认证意味着不做任何认证就授予角色访问,因此会绕过所有安全性。如果系统具有可用的ident服务,可以把trust项替换为ident认证。

编辑pg_hba.conf文件

最初,pg_hba.conf文件被设置成gpadmin用户对数据库具有完全访问权限,而其他Greenplum Database角色则没有数据库访问权限。用户需要编辑pg_hba.conf文件,以使用户能够访问数据库并保证gpadmin用户的安全。需要考虑删除具有信任身份验证的条目,因为它们允许有权访问服务器的任何人以他们选择的任何角色进行连接。对于本地(UNIX套接字)连接,可使用ident身份验证,这要求操作系统用户匹配指定的角色。对于本地和远程TCP连接,身份验证要求客户端的主机运行ident服务。用户可以在主控主机上安装ident服务,然后对本地TCP连接使用ident身份验证,例如127.0.0.1/28。将身份验证用于远程TCP连接的安全性较差,因为它要求用户信任客户端主机上身份服务的完整性。

这个例子展示如何编辑Master的pg_hba.conf文件来允许对从所有角色访问所有数据库的远程客户端使用加密口令认证。

要编辑pg_hba.conf
  1. 在一个文本编辑器中打开文件$MASTER_DATA_DIRECTORY/pg_hba.conf
  2. 为想要允许的每一类连接在文件中增加一行。记录会被顺序读取,因此记录的顺序是有意义的。通常,较早出现的记录将有比较严格的连接匹配参数以及较弱的认证方法,而较晚出现的记录将有较宽松的匹配参数和较强的认证方法。例如:
    # 允许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加密的口令来认证用户
    # 注意要使用SHA-256加密,用password替换下面行中的md5
    host    all   dba   192.168.0.0/32  md5
    

认证方法

基本认证

支持下列基本认证方法:
Password 或者 MD5
要求客户端提供一个口令,可以为两者之一:
  • Md5 – 口令作为MD5哈希传输。
  • Password – 口令以明文传输。传输过程中应该总是使用SSL连接来防止口令嗅探。这是可配置的,更多信息请见Greenplum数据库管理员指南中的“加密口令”。
Reject
拒绝有匹配参数的连接。用户通常应该使用这种方法来限制来自特定主机或者不安全连接的访问。
Ident
基于客户端的操作系统用户名的认证。用户只对本地连接使用这种方法。对来自远程主机的TCP连接使用ident要求客户端的主机正在运行ident服务。身份认证方法仅应与受信任的封闭网络上的远程主机一起使用。
下面是pg_hba.conf基本认证项的一些例子: entries:
hostnossl    all   all        0.0.0.0   reject
hostssl      all   testuser   0.0.0.0/0 md5
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
            
下列Kerberos服务器设置在postgresql.conf中被指定:
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认证的推荐步骤:
  1. 用要通过LDAP认证的数据库用户/角色设置LDAP服务器。
  2. 在数据库上:
    1. 验证要通过LDAP认证的数据库用户存在于数据库上。LDAP仅被用于验证用户名/口令对,因此角色应该存在于数据库中。
    2. 更新$MASTER_DATA_DIRECTORY中的pg_hba.conf文件为相应的用户使用LDAP作为认证方法。注意pg_hba.conf文件中第一个匹配用户/角色的项将被用作认证机制,因此项在该文件中的位置很重要。
    3. 重载服务器让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
在做搜索+绑定认证时,匹配正在搜索的用户名的属性。
Example:
ldapserver=ldap.greenplum.com prefix="cn=" suffix=", dc=greenplum, dc=com"
下面是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)属性与被请求的数据库用户名进行比较。数据库用户应该在数据库中存在。映射文件可以被用来在系统用户名和数据库用户名之间进行映射。

SSL认证参数

认证方法:
  • Cert
    认证选项:
    Hostssl
    连接类型必须是hostssl。
    map=mapping
    映射。
    这在pg_ident.conf文件中被指定,或者在ident_file服务器设置中指定的文件中指定。
    下面是SSL客户端认证的pg_hba.conf项的例子:
    Hostssl testdb certuser 192.168.0.0/16 cert
                               Hostssl testdb all 192.168.0.0/16 cert map=gpuser
                    

OpenSSL配置

Greenplum数据库默认会读取$GP_HOME/etc/openssl.cnf中指定的OpenSSL配置文件。用户可以通过修改或者更新这个文件并且重启服务器对OpenSSL的默认配置做更改。

创建一个自签名证书

自签名证书可以被用来测试,但是生产中应该使用由证书颁发机构(CA)(全球CA或者本地CA)签发的证书,这样客户端就能够验证服务器的身份。如果所有的客户端都是组织本地的,推荐使用本地CA。

要为服务器创建一个自签名证书:
  1. 输入下列openssl命令: command:
    openssl req -new -text -out server.req
  2. 在提示中输入要求的信息。

    确保为公共名输入本地主机名。挑战口令可以留空。

  3. 这个程序生成受口令保护的密钥,它不接受短于四字符的口令。要移除口令(如果想让服务器自动启动还必须移除),运行下面的命令:
    openssl rsa -in privkey.pem -out server.key rm privkey.pem
  4. 输入旧口令解锁现有的密钥。然后输入下面的命令:
    openssl req -x509 -in server.req -text -key server.key -out server.crt

    这会把证书转变成一个自签名的证书并且把密钥和证书拷贝到服务器将查找它们的地方。

  5. 最后,运行下列命令: command:
    chmod og-rwx server.key

更多如何创建服务器私钥和证书的细节,请参考OpenSSL的文档。

为SSL认证配置postgresql.conf

下面的服务器设置需要在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
客户端连接参数可以使用下列环境变量设置:
  • sslmodePGSSLMODE
  • sslkeyPGSSLKEY
  • sslrootcertPGSSLROOTCERT
  • sslcertPGSSLCERT
  • sslcrlPGSSLCRL 

基于PAM的认证

“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

Note: 不支持RADIUS计费。

只有用户已经在数据库中存在时,RADIUS认证才有用。

为了强密码,RADIUS加密向量要求SSL被启用。

RADIUS认证选项

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
Note: 注意: 调高这些参数的值可能会导致Greenplum数据库请求更多共享内存。为了缓和这种影响,考虑降低其他内存相关的参数,例如 gp_cached_segworkers_threshold
要更改允许的连接数:
  1. 停止Greenplum数据库系统:
    $ gpstop
  2. 在Master主机上,编辑$MASTER_DATA_DIRECTORY/postgresql.conf并且更改下面两个参数:
    • max_connections – 想要允许的活动用户会话数加上superuser_reserved_connections的数量
    • max_prepared_transactions – 必须大于等于 max_connections.
  3. 在每个Segment实例上,编辑SEGMENT_DATA_DIRECTORY/postgresql.conf并且更改下面两个参数:
    • max_connections – 必须是Master上值的5-10倍。
    • max_prepared_transactions – 必须等于Master上的值。
  4. 重启Greenplum数据库系统:
    $ gpstart

加密客户端/服务器连接

Greenplum数据库对于客户端和Master服务器之间的SSL连接有原生支持。SSL连接可以防止第三方进行包嗅探,还能防止中间人攻击。只要客户端连接会通过不安全的链接,就应该使用SSL,并且只要使用客户端证书认证也应该使用SSL。

Note: 有关在gpfdist服务器和Greenplum数据库Segment主机之间加密数据的信息,请见加密gpfdist连接.

启用SSL要求在客户端和Master服务器系统上都安装OpenSSL。可通过在Master的postgresql.conf中设置服务器配置参数ssl=on让Greenplum以启用SSL的方式启动。在以SSL模式启动时,服务器将在Master的数据目录中查找server.key(服务器私钥)文件和server.crt(服务器证书)文件。在启用SSL的Greenplum系统能启动之前,这些文件必须被正确地设置好。

Important: 不要用口令保护私钥。服务器不会为私钥提示要求口令,而不提供口令数据库启动会失败并且报出错误。

自签名证书可以被用来测试,但是生产中应该使用由证书颁发机构(CA)(全球CA或者本地CA)签发的证书,这样客户端就能够验证服务器的身份。如果所有的客户端都是组织本地的,推荐使用本地CA。创建自签名证书的步骤请见 创建一个自签名证书