本主题说明如何为 Greenplum 数据库配置客户端连接和身份验证。
当一个 Greenplum 数据库系统第一次初始化时,系统包含一个预定义的超级用户角色。该角色将与初始化 Greenplum 数据库系统的操作系统用户同名。这个角色被称为gpadmin。默认情况下,系统配置为仅允许从gpadmin角色到数据库的本地连接。如果您想允许任何其他角色连接,或者如果您想允许来自远程主机的连接,您必须配置 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文件为 gpadmin 用户设置了丰富的权限,而对其他 Greenplum 数据库角色没有数据库访问权限。您需要编辑该pg_hba.conf文件以允许用户访问数据库并保护 gpadmin 用户。考虑删除具有信任身份验证的条目,因为它们允许任何有权访问服务器的人连接到他们选择的任何角色。对于本地(UNIX 套接字)连接,使用 ident 身份验证,这要求操作系统用户匹配指定的角色。对于本地和远程 TCP 连接,身份验证需要客户端的主机运行缩进服务。您可以在 master 主机上安装 ident 服务,然后对本地 TCP 连接使用 ident 身份验证,例如127.0.0.1/28. 对远程 TCP 连接使用 ident 身份验证不太安全,因为它要求您信任客户端主机上 ident 服务的完整性。
此示例显示如何编辑主服务器的 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_connectionsserver 配置参数。这是一个本地参数,意味着您必须在postgresql.confmaster、standby master和每个segment实例(primary和mirror)的文件中设置它。on segment的推荐值max_connections是 master 上的值的 5-10 倍。
设置时max_connections,还必须设置从属参数max_prepared_transactions。此值必须至少与max_connectionsmaster 上的值一样大,并且段实例应设置为与 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_connectionsmaster 上的值。
停止并重新启动您的 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 数据库可以访问 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 文档。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下