Postgresql配置客户端身份验证
本主题说明如何为 Greenplum 数据库配置客户端连接和身份验证。
当一个 Greenplum 数据库系统第一次初始化时,系统包含一个预定义的超级用户角色。该角色将与初始化 Greenplum 数据库系统的操作系统用户同名。这个角色被称为gpadmin
。默认情况下,系统配置为仅允许从gpadmin
角色到数据库的本地连接。如果您想允许任何其他角色连接,或者如果您想允许来自远程主机的连接,您必须配置 Greenplum 数据库以允许此类连接。本节说明如何配置客户端连接和对 Greenplum 数据库的身份验证。
-
通过 TLS/SSL 使用 LDAP 身份验证
您可以使用 LDAP 服务器控制对 Greenplum 数据库的访问,并且可以选择通过将参数添加到 pg_hba.conf 文件条目来保护连接。 -
使用 Kerberos 身份验证
您可以使用 Kerberos 身份验证服务器控制对 Greenplum 数据库的访问。 -
为 Linux 客户端配置 Kerberos
您可以配置 Linux 客户端应用程序以连接到配置为使用 Kerberos 进行身份验证的 Greenplum 数据库系统。 -
为 Windows 客户端配置 Kerberos
您可以配置 Microsoft Windows 客户端应用程序以连接到配置为使用 Kerberos 进行身份验证的 Greenplum 数据库系统。
允许连接到 Greenplum 数据库
客户端访问和身份验证由标准 PostgreSQL 基于主机的身份验证文件 pg_hba.conf 控制。有关此文件的详细信息,请参阅PostgreSQL 文档中的 pg_hba.conf 文件。
在 Greenplum 数据库中,主实例的 pg_hba.conf 文件控制客户端对您的 Greenplum 数据库系统的访问和身份验证。Greenplum 数据库段也有 pg_hba.conf 文件,但这些文件已经正确配置为只允许来自主主机的客户端连接。段从不接受外部客户端连接,因此无需更改pg_hba.conf
段上的文件。
pg_hba.conf 文件的一般格式是一组记录,每行一个。Greenplum 数据库忽略空行和#
注释字符之后的任何文本。一条记录由许多由空格或制表符分隔的字段组成。如果字段值被引用,则字段可以包含空格。记录不能跨行继续。每个远程客户端访问记录具有以下格式:
host database role address authentication-method
每个 UNIX 域套接字访问记录都采用以下格式:
local database role authentication-method
下表描述了每个字段的含义。
Field | Description |
---|---|
local | 匹配使用 UNIX 域套接字的连接尝试。如果没有这种类型的记录,则不允许 UNIX 域套接字连接。 |
host | 匹配使用 TCP/IP 进行的连接尝试。listen_addresses 除非使用适当的服务器配置参数值启动服务器,否则无法进行远程 TCP/IP 连接。 |
hostssl | 匹配使用 TCP/IP 进行的连接尝试,但仅当使用 SSL 加密进行连接时。必须在服务器启动时通过设置ssl 服务器配置参数启用 SSL。 |
hostnossl | 匹配通过不使用 SSL 的 TCP/IP 进行的连接尝试。 |
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 使用 32 的掩码长度或对 IPv6 使用 128 的掩码长度。在网络地址中,不要省略尾随零。以 IPv4 格式给出的条目将仅匹配 IPv4 连接,而以 IPv6 格式给出的条目将仅匹配 IPv6 连接,即使表示的地址在 IPv4-in-IPv6 范围内。笔记:如果主机系统 C 库不支持 IPv6 地址,则 IPv6 格式的条目将被拒绝。如果指定了主机名(不是 IP 地址或 IP 范围的地址被视为主机名),则将该名称与客户端 IP 地址的反向名称解析的结果进行比较(例如,反向 DNS 查找,如果使用 DNS)。主机名比较不区分大小写。如果匹配,则对主机名执行前向名称解析(例如,前向 DNS 查找),以检查它解析到的任何地址是否等于客户端 IP 地址。如果两个方向都匹配,则认为该条目匹配。一些主机名数据库允许将一个 IP 地址与多个主机名相关联,但操作系统在被要求解析 IP 地址时只返回一个主机名。使用的主机名pg_hba.conf 必须是客户端 IP 地址的地址到名称解析返回的主机名,否则该行将不被视为匹配。当在 中指定主机名时pg_hba.conf ,您应该确保名称解析相当快。设置本地名称解析缓存(例如nscd . 此外,您可以启用服务器配置参数log_hostname 以在日志中查看客户端主机名而不是 IP 地址。 |
IP-address IP-mask | 这些字段可用作 CIDR 地址表示法的替代项。不是指定掩码长度,而是在单独的列中指定实际掩码。例如,255.0.0.0 表示 IPv4 CIDR 掩码长度为 8,255.255.255.255 表示 CIDR 掩码长度为 32。 |
authentication-method | 指定连接时要使用的身份验证方法。Greenplum 支持PostgreSQL 9.4支持的认证方法。 |
注意:对于更安全的系统,请考虑从 pg_hba.conf
文件中删除使用信任身份验证的远程连接的记录。信任身份验证授予可以连接到服务器的任何用户使用他们指定的任何角色访问数据库。对于本地 UNIX 套接字连接,您可以安全地用 ident 身份验证替换信任身份验证。您还可以对本地和远程 TCP 客户端使用 ident 身份验证,但客户端主机必须运行 ident 服务,并且您必须信任该机器的完整性。
编辑 pg_hba.conf 文件
最初,该pg_hba.conf
文件为 gpadmin 用户设置了丰富的权限,而对其他 Greenplum 数据库角色没有数据库访问权限。您需要编辑该pg_hba.conf
文件以允许用户访问数据库并保护 gpadmin 用户。考虑删除具有信任身份验证的条目,因为它们允许任何有权访问服务器的人连接到他们选择的任何角色。对于本地(UNIX 套接字)连接,使用 ident 身份验证,这要求操作系统用户匹配指定的角色。对于本地和远程 TCP 连接,身份验证需要客户端的主机运行缩进服务。您可以在 master 主机上安装 ident 服务,然后对本地 TCP 连接使用 ident 身份验证,例如127.0.0.1/28
. 对远程 TCP 连接使用 ident 身份验证不太安全,因为它要求您信任客户端主机上 ident 服务的完整性。
此示例显示如何编辑主服务器的 pg_hba.conf 文件,以允许远程客户端使用加密密码身份验证从所有角色访问所有数据库。
编辑 pg_hba.conf
-
在文本编辑器中打开文件 $MASTER_DATA_DIRECTORY/pg_hba.conf。
-
为要允许的每种连接类型在文件中添加一行。记录是按顺序读取的,因此记录的顺序很重要。通常,较早的记录将具有紧密的连接匹配参数和较弱的身份验证方法,而较晚的记录将具有较宽松的匹配参数和更强的身份验证方法。例如:
# allow the gpadmin user local access to all databases # using ident authentication local all gpadmin ident sameuser host all gpadmin 127.0.0.1/32 ident host all gpadmin ::1/128 ident # allow the 'dba' role access to any database from any # host with IP address 192.168.x.x and use md5 encrypted # passwords to authenticate the user # Note that to use SHA-256 encryption, replace md5 with # password in the line below host all dba 192.168.0.0/32 md5 # allow all roles access to any database from any # host and use ldap to authenticate the user. Greenplum role # names must match the LDAP common name. host all all 192.168.0.0/32 ldap ldapserver=usldap1 ldapport=1389 ldapprefix="cn=" ldapsuffix=",ou=People,dc=company,dc=com"
-
保存并关闭文件。
-
重新加载 pg_hba.conf 配置文件以使您的更改生效:
$ gpstop -u
注意:请注意,您还可以通过设置对象权限来控制数据库访问,如管理对象权限中所述。pg_hba.conf 文件只控制谁可以启动数据库会话以及如何验证这些连接。
限制并发连接
Greenplum 数据库基于每个连接分配一些资源,因此建议设置允许的最大连接数。
要限制 Greenplum 数据库系统的活动并发会话数,您可以配置max_connections
server 配置参数。这是一个本地参数,意味着您必须在postgresql.conf
master、standby master和每个segment实例(primary和mirror)的文件中设置它。on segment的推荐值max_connections
是 master 上的值的 5-10 倍。
设置时max_connections
,还必须设置从属参数max_prepared_transactions
。此值必须至少与max_connections
master 上的值一样大,并且段实例应设置为与 master 相同的值。
例如:
-
在
$MASTER_DATA_DIRECTORY/postgresql.conf
(包括备用主控):max_connections=100 max_prepared_transactions=100
-
对于
SEGMENT_DATA_DIRECTORY/postgresql.conf
所有段实例:max_connections=500 max_prepared_transactions=100
以下步骤使用 Greenplum 数据库实用程序设置参数值gpconfig
。
有关信息gpconfig
,请参阅Greenplum 数据库实用程序指南。
更改允许的连接数
-
以 Greenplum 数据库管理员身份登录到 Greenplum 数据库主主机并获取文件
$GPHOME/greenplum_path.sh
。 -
设置
max_connections
参数的值。此gpconfig
命令将段上的值设置为 1000,将主站上的值设置为 200。$ gpconfig -c max_connections -v 1000 -m 200
段上的值必须大于主节点上的值。on segment的推荐值
max_connections
是 master 上的值的 5-10 倍。 -
设置
max_prepared_transactions
参数的值。此gpconfig
命令在主节点和所有段上将值设置为 200。$ gpconfig -c max_prepared_transactions -v 200
的值
max_prepared_transactions
必须大于或等于max_connections
master 上的值。 -
停止并重新启动您的 Greenplum 数据库系统。
$ gpstop -r
-
gpconfig
-s
您可以使用该选项检查主节点和段上的参数值。此gpconfig
命令显示max_connections
参数的值。$ gpconfig -s max_connections
注意:提高这些参数的值可能会导致 Greenplum 数据库请求更多的共享内存。为了减轻这种影响,请考虑减少其他与内存相关的参数,例如gp_cached_segworkers_threshold
.
加密客户端/服务器连接
为客户端连接到 Greenplum 数据库启用 SSL 以加密通过客户端和数据库之间的网络传递的数据。
Greenplum 数据库对客户端和主服务器之间的 SSL 连接具有原生支持。SSL 连接可以防止第三方窥探数据包,还可以防止中间人攻击。每当客户端连接通过不安全的链接时都应使用 SSL,并且无论何时使用客户端证书身份验证都必须使用 SSL。
在 SSL 模式下启用 Greenplum 数据库需要以下项目。
-
OpenSSL 安装在客户端和主服务器主机(主服务器和备用主服务器)上。
-
应该为master主机和备用master主机正确生成SSL文件server.key(服务器私钥)和server.crt(服务器证书)。
- 不应使用密码保护私钥。服务器不会提示输入私钥的密码,如果需要,Greenplum 数据库启动失败并出现错误。
- 在生产系统上,主控主机和备用主控主机应该有一个密钥和证书对,主控主机和备用主控主机的主题 CN(Common Name)。自签名证书可用于测试,但在生产中应使用证书颁发机构 (CA) 签名的证书,以便客户端可以验证服务器的身份。可以使用全局或本地 CA。如果所有客户端都是组织本地的,则建议使用本地 CA。
-
确保 Greenplum 数据库可以访问 server.key 和 server.crt,以及任何额外的身份验证文件,例如
root.crt
(对于受信任的证书颁发机构)。当以 SSL 模式启动时,Greenplum 数据库主服务器会查找 server.key 和 server.crt。默认情况下,如果文件不在主数据目录 ($MASTER_DATA_DIRECTORY
) 中,Greenplum 数据库不会启动。此外,如果您使用其他 SSL 身份验证文件,例如root.crt
(受信任的证书颁发机构),这些文件必须位于主控主机上。如果Greenplum数据库主镜像启用了SSL客户端认证,SSL认证文件必须同时在master主机和备用master主机上,并且不应该放在默认目录下
$MASTER_DATA_DIRECTORY
。启用主镜像时,initstandby
操作会将主服务器的内容$MASTER_DATA_DIRECTORY
和不正确的 SSL 密钥复制到备用主服务器,证书文件(主文件,而不是备用主文件)将阻止备用主服务器启动。postgresql.conf
您可以使用参数sslcert
、sslkey
、sslrootcert
和为 SSL 服务器文件的位置指定不同的目录sslcrl
。有关参数的详细信息,请参阅《安全配置指南》中的SSL 客户端认证。
Greenplum 数据库可以在启用 SSL 的情况下启动,方法是在 master 和备用 master 主机上ssl=on
的文件中设置服务器配置参数。postgresql.conf
此gpconfig
命令设置参数:
gpconfig -c ssl -m on -v off
设置参数需要重新启动服务器。此命令重新启动系统:gpstop -ra
.
创建不带密码的自签名证书仅用于测试
要为服务器创建快速自签名证书以进行测试,请使用以下 OpenSSL 命令:
# openssl req -new -text -out server.req
输入提示要求的信息。请务必将本地主机名输入为Common Name。挑战密码可以留空。
该程序将生成一个受密码保护的密钥,并且不接受长度少于四个字符的密码。
要将此证书用于 Greenplum 数据库,请使用以下命令删除密码:
# 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 文档。