Postgresql配置客户端身份验证

2022-07-08  本文已影响0人  与狼共舞666

本主题说明如何为 Greenplum 数据库配置客户端连接和身份验证。

当一个 Greenplum 数据库系统第一次初始化时,系统包含一个预定义的超级用户角色。该角色将与初始化 Greenplum 数据库系统的操作系统用户同名。这个角色被称为gpadmin。默认情况下,系统配置为仅允许从gpadmin角色到数据库的本地连接。如果您想允许任何其他角色连接,或者如果您想允许来自远程主机的连接,您必须配置 Greenplum 数据库以允许此类连接。本节说明如何配置客户端连接和对 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

  1. 在文本编辑器中打开文件 $MASTER_DATA_DIRECTORY/pg_hba.conf。

  2. 为要允许的每种连接类型在文件中添加一行。记录是按顺序读取的,因此记录的顺序很重要。通常,较早的记录将具有紧密的连接匹配参数和较弱的身份验证方法,而较晚的记录将具有较宽松的匹配参数和更强的身份验证方法。例如:

    # 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"
    
  3. 保存并关闭文件。

  4. 重新加载 pg_hba.conf 配置文件以使您的更改生效:

    $ gpstop -u
    

注意:请注意,您还可以通过设置对象权限来控制数据库访问,如管理对象权限中所述。pg_hba.conf 文件只控制谁可以启动数据库会话以及如何验证这些连接。

限制并发连接

Greenplum 数据库基于每个连接分配一些资源,因此建议设置允许的最大连接数。

要限制 Greenplum 数据库系统的活动并发会话数,您可以配置max_connectionsserver 配置参数。这是一个本地参数,意味着您必须在postgresql.confmaster、standby master和每个segment实例(primary和mirror)的文件中设置它。on segment的推荐值max_connections是 master 上的值的 5-10 倍。

设置时max_connections,还必须设置从属参数max_prepared_transactions。此值必须至少与max_connectionsmaster 上的值一样大,并且段实例应设置为与 master 相同的值。

例如:

以下步骤使用 Greenplum 数据库实用程序设置参数值gpconfig

有关信息gpconfig,请参阅Greenplum 数据库实用程序指南

更改允许的连接数

  1. 以 Greenplum 数据库管理员身份登录到 Greenplum 数据库主主机并获取文件$GPHOME/greenplum_path.sh

  2. 设置max_connections参数的值。此gpconfig命令将段上的值设置为 1000,将主站上的值设置为 200。

    $ gpconfig -c max_connections -v 1000 -m 200
    

    段上的值必须大于主节点上的值。on segment的推荐值max_connections是 master 上的值的 5-10 倍。

  3. 设置max_prepared_transactions参数的值。此gpconfig命令在主节点和所有段上将值设置为 200。

    $ gpconfig -c max_prepared_transactions -v 200
    

    的值max_prepared_transactions必须大于或等于max_connectionsmaster 上的值。

  4. 停止并重新启动您的 Greenplum 数据库系统。

    $ gpstop -r
    
  5. gpconfig -s您可以使用该选项检查主节点和段上的参数值。此gpconfig命令显示max_connections参数的值。

    $ gpconfig -s max_connections
    

注意:提高这些参数的值可能会导致 Greenplum 数据库请求更多的共享内存。为了减轻这种影响,请考虑减少其他与内存相关的参数,例如gp_cached_segworkers_threshold.

加密客户端/服务器连接

为客户端连接到 Greenplum 数据库启用 SSL 以加密通过客户端和数据库之间的网络传递的数据。

Greenplum 数据库对客户端和主服务器之间的 SSL 连接具有原生支持。SSL 连接可以防止第三方窥探数据包,还可以防止中间人攻击。每当客户端连接通过不安全的链接时都应使用 SSL,并且无论何时使用客户端证书身份验证都必须使用 SSL。

在 SSL 模式下启用 Greenplum 数据库需要以下项目。

Greenplum 数据库可以在启用 SSL 的情况下启动,方法是在 master 和备用 master 主机上ssl=on的文件中设置服务器配置参数。postgresql.confgpconfig命令设置参数:

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 文档

上一篇下一篇

猜你喜欢

热点阅读