配置客户端认证
配置客户端认证
允许到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文件。
host database role CIDR-address authentication-method
local database role authentication-method
- 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指定它匹配所哟角色。如果指定的角色是一个组并且想包括其中的所有成员,可在角色名前面放一个+。通过用逗号分隔角色名,可以提供多个角色名。可以指定一个包含角色名的单独文件,方法是在这个域中给出加上前缀@的文件名。
- 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_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加密的口令来认证用户 # 注意要使用SHA-256加密,用password替换下面行中的md5 host all dba 192.168.0.0/32 md5
认证方法
基本认证
- password或者md5
- 要求客户端提供一个口令,可以为两种之一:
- md5 – 口令作为MD5哈希传输。
- password – 口令以明文传输。传输过程中应该总是使用SSL连接来防止口令嗅探。这是可配置的,更多信息请见Greenplum数据库管理员指南中的“加密口令”。
- reject
- 拒绝有匹配参数的连接。用户通常应该使用这种方法来限制来自特定主机或者不安全连接的访问。
- ident
- 基于客户端的操作系统用户名的认证。用户只用该对本地连接使用这种方法。
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)认证。
servicename/hostname@realm
- Map
- 映射系统和数据库用户。
- Include_realm
- 在ident映射文件中指定系统用户名中包括的realm名称的选项。
- Krb_realm
- 为匹配的主体指定realm名称。
- Krb_server_hostname
- 服务主体的主机名。
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仅被用于验证用户名/口令对,因此角色应该存在于数据库中。
- 更新$MASTER_DATA_DIRECTORY中的pg_hba.conf文件为相应的用户使用LDAP作为认证方法。注意pg_hba.conf文件中第一个匹配用户/角色的项将被用作认证机制,因此项在该文件中的位置很重要。
- 重载服务器让pg_hba.conf配置设置生效(gpstop -u)。
- ldapserver
- 要连接的LDAP服务器的名称或者IP地址。可以指定多个服务器,用空格分隔。
- ldapprefix
- 在做简单绑定认证时,形成要绑定为的DN时自动加在用户名前面的字符串。
- ldapsuffix
- 在做简单绑定认证时,形成要绑定为的DN时自动加在用户名后面的字符串。
- ldapport
- 要连接的LDAP服务器上的端口号。如果没有指定端口,将使用LDAP库的默认端口设置。
- ldaptls
- 设置为1让PostgreSQL和LDAP服务器之间的连接是用TLS加密。注意这只加密到LDAP服务器的流量 — 到客户端的连接仍将是未加密的(除非使用了SSL)。
- ldapbasedn
- 在做搜索+绑定认证时,要开始在其中搜索用户的根DN。
- ldapbinddn
- 在做搜索+绑定认证时,绑定到目录以执行搜索的用户的DN。
- ldapbindpasswd
- 在做搜索+绑定认证时,绑定到目录以执行搜索的用户的口令。
- ldapsearchattribute
- 在做搜索+绑定认证时,匹配正在搜索的用户名的属性。
ldapserver=ldap.greenplum.com prefix="cn=" suffix=", dc=greenplum, dc=com"
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。
- 输入下列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
这会把证书转变成一个自签名的证书并且把密钥和证书拷贝到服务器将查找它们的地方。
- 最后,运行下列命令:
chmod og-rwx server.key
更多如何创建服务器私钥和证书的细节,请参考OpenSSL的文档。
为SSL认证配置postgresql.conf
- ssl boolean。启用SSL连接。
- ssl_renegotiation_limit integer。指定密钥重新协商之前的数据限制。
- ssl_ciphers string。列出允许的SSL加密算法。
- server.crt。服务器证书。
- server.key。服务器私钥。
- root.crt。可信的证书机构。
- root.crl。被证书机构撤销的证书。
配置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”(可插拔认证模块)被用来验证用户名/口令对,类似于基本认证。PAM认证只在用户已经在数据库中存在时才有用。
参数
- pamservice
- 默认的PAM服务是postgresql。注意如果PAM被设置为读取/etc/shadow,认证将会失败因为PostgreSQL服务器由一个非根用户启动。
local all gpuser am pamservice=postgresql
Radius认证
RADIUS(远程认证拨号用户服务)认证通过向一台配置好的RADIUS服务器发送'Authenticate Only'类型的Access Request消息工作。它包括用于用户名、口令(加密)以及网络访问服务器(NAS)标识符的参数。这个请求使用由radiussecret选项中指定的共享秘密加密。RADIUS服务器会响应Access Accept或者Access Reject。
只有用户已经在数据库中存在时,RADIUS认证才有用。
为了强密码,RADIUS加密向量要求SSL被启用。
RADIUS认证选项
- radiusserver
- RADIUS服务器的名称。
- radiussecret
- RADIUS共享秘密。
- radiusport
- RADIUS服务器上要连接的端口。
- radiusidentifier
- RADIUS请求中的NAS标识符。
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上一样的值。
max_connections=100 max_prepared_transactions=100
max_connections=500 max_prepared_transactions=100
- 停止Greenplum数据库系统:
$ gpstop
- 在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数据库系统:
$ gpstart
加密客户端/服务器连接
Greenplum数据库对于客户端和Master服务器之间的SSL连接有原生支持。SSL连接可以防止第三方进行包嗅探,还能防止中间人攻击。只要客户端连接会通过不安全的链接,就应该使用SSL,并且只要使用客户端证书认证也应该使用SSL。
启用SSL要求在客户端和Master服务器系统上都安装OpenSSL。可通过在Master的postgresql.conf中设置服务器配置参数ssl=on让Greenplum以启用SSL的方式启动。在以SSL模式启动时,服务器将在Master的数据目录中查找server.key(服务器私钥)文件和server.crt(服务器证书)文件。在启用SSL的Greenplum系统能启动之前,这些文件必须被正确地设置好。
自签名证书可以被用来测试,但是生产中应该使用由证书颁发机构(CA)(全球CA或者本地CA)签发的证书,这样客户端就能够验证服务器的身份。如果所有的客户端都是组织本地的,推荐使用本地CA。创建自签名证书的步骤请见创建一个自签名证书。