文档章节

pg_hba.conf 文件详解

Goopand
 Goopand
发布于 2014/11/27 14:42
字数 2923
阅读 21
收藏 0

pg_hba.conf 文件

客户端认证是由一个配置文件(通常名为 pg_hba.conf)控制的,它存放在数据库集群的数据目录里。HBA 的意思是"host-based authentication",也就是基于主机的认证。在initdb 初始化数据目录的时候,它会安装一个缺省的 pg_hba.conf 文件。不过我们也可以把认证配置文件放在其它地方;参阅 hba_file 配置参数。

pg_hba.conf 文件的常用格式是一组记录,每行一条。空白行将被忽略,井号 # 开头的注释也被忽略。一条记录是由若干用空格和/或制表符分隔的字段组成。如果字段用引号包围,那么它可以包含空白。记录不能跨行存在。

每条记录声明一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关的话)、一个数据库名、一个用户名字、对匹配这些参数的连接使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库名和用户名的记录将用于执行认证。这个处理过程没有"跨越"或者"回头"的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。

每条记录可以是下面七种格式之一:

local      database  user  auth-method  [auth-option]
host       database  user  CIDR-address  auth-method  [auth-option]
hostssl    database  user  CIDR-address  auth-method  [auth-option]
hostnossl  database  user  CIDR-address  auth-method  [auth-option]
host       database  user  IP-address  IP-mask  auth-method  [auth-option]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-option]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-option]

各个字段的含义如下:

  • local

  • 这条记录匹配企图通过 Unix 域套接字进行的连接。没有这种类型的记录,就不允许 Unix 域套接字的连接。

  • host

  • 这条记录匹配企图通过 TCP/IP 进行的连接。host 记录匹配 SSL 和非 SSL 的连接请求。

    【注意】除非服务器带着合适的 listen_addresses 配置参数值启动,否则将不可能进行远程的 TCP/IP 连接,因为缺省的行为是只监听本地自环地址localhost 的连接。

  • hostssl

  • 这条记录匹配企图使用 TCP/IP 的 SSL 连接。但必须是使用 SSL 加密的连接。

    要使用这个选项,编译服务器的时候必须打开 SSL 支持。而且在服务器启动的时候必须打开 ssl 配置选项(参阅节16.7)。

  • hostnossl

  • 这条记录与 hostssl 相反:它只匹配那些在 TCP/IP 上不使用 SSL 的连接请求。

  • database

  • 声明记录所匹配的数据库名称。值 all 表明该记录匹配所有数据库,值 sameuser 表示如果被请求的数据库和请求的用户同名,则匹配。值 samerole 表示请求的用户必须是一个与数据库同名的角色中的成员(samegroup 是一个已经废弃了,但目前仍然被接受的 samerole同义词)。在其它情况里,这就是一个特定的 PostgreSQL 数据库名字。可以通过用逗号分隔的方法声明多个数据库,也可以通过前缀 @ 来声明一个包含数据库名的文件。

  • user

  • 为这条记录声明所匹配的数据库用户。值 all 表明它匹配于所有用户。否则,它就是特定数据库用户的名字或者是一个前缀 + 的组名称。请注意,在 PostgreSQL 里,用户和组没有真正的区别,+ 实际上只是意味着"匹配任何直接或者间接属于这个角色的成员",而没有 + 记号的名字只匹配指定的角色。多个用户名可以通过用逗号分隔的方法声明。一个包含用户名的文件可以通过在文件名前面前缀 @ 来声明。

  • CIDR-address

  • 声明这条记录匹配的客户端机器的 IP 地址范围。它包含一个标准的点分十进制的 IP 地址(只能用数值而不能用域或主机名)和一个 CIDR 掩码长度。掩码长度表示客户端 IP 地址必须匹配的高位二进制位数。在给出的 IP 地址里,这个长度的右边的二进制位必须为零。在 IP 地址、/ 、CIDR 掩码长度之间不能有空白。

    典型的 CIDR-address 举例:172.20.143.89/32 表示一个主机,172.20.143.0/24 表示一个小子网,10.6.0.0/16 表示一个大子网。要声明单个主机,给 IPv4 地址声明 CIDR 掩码 32 ,给 IPv6 地址声明 128 。不要在地址中省略结尾的 0 。

    以 IPv4 格式给出的 IP 地址会匹配那些拥有对应地址的 IPv6 连接,比如 127.0.0.1 将匹配 IPv6 地址 ::ffff:127.0.0.1 。一个以 IPv6 格式给出的记录将只匹配 IPv6 连接,即使对应的地址在 IPv4-in-IPv6 范围内。请注意如果系统的 C 库不支持 IPv6 地址,那么 IPv6 的格式将被拒绝。

    这个字段只适用于 host, hostssl, hostnossl 记录。

  • IP-address
    IP-mask

  • 这些方法可以用于作为 CIDR-address 表示法的替补。它不是声明掩码的长度,而是在另外一个字段里声明实际的掩码。比如,255.0.0.0 表示 IPv4 CIDR 掩码长度 8 ,而 255.255.255.255 表示 CIDR 掩码长度 32 。

    这些字段只适用于 host, hostssl, hostnossl 记录。

  • auth-method

  • 声明通过这条记录连接的时候使用的认证方法。可能的选择在下面简介,详细情况在节20.2中介绍。

    • trust

    • 无条件地允许连接。这个方法允许任何可以与 PostgreSQL 数据库服务器连接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行连接,而不需要口令。参阅节20.2.1获取细节。

    • reject

    • 无条件地拒绝连接。常用于从一个组中"过滤"某些主机。

    • md5

    • 要求客户端提供一个 MD5 加密的口令进行认证。参阅节20.2.2获取细节。

    • crypt

    • 【注意】这个选项只有在与 7.2 以前的客户端进行通讯的时候才建议使用。

      crypt 要求客户端提供一个 crypt() 加密的口令用于认证。现在我们建议使用 md5 。参阅节20.2.2

    • password

    • 要求客户端提供一个未加密的口令进行认证。因为口令是以明文形式在网络上传递的,所以我们不应该在不安全的网络上使用这个方式。并且它通常还不能和线程化的客户端应用一起使用。参阅节20.2.2获取细节。

    • krb5

    • 用 Kerberos V5 认证用户。只有在进行 TCP/IP 连接的时候才能用。参阅节20.2.3获取细节。

    • ident

    • 获取客户的操作系统名然后检查该用户是否允许以要求的数据库用户进行连接,方法是参照在 ident 关键字后面声明的映射。对于 TCP/IP 连接,用户的身份是通过与运行在客户端上的 ident 服务器连接进行判断的,对于本地连接,它是从操作系统获取的。参阅节20.2.4获取细节。

    • ldap

    • 使用 LDAP 进行认证。参阅节20.2.5获取细节。

    • pam

    • 使用操作系统提供的可插入认证模块服务(PAM)来认证。参阅节20.2.6获取细节。

  • auth-option

  • 这个可选字段的含义取决于选择的认证方法。细节在下面。

用 @ 构造包含的文件是当作一列名字读取的,这些名字可以用空白或者逗号分隔。注释用 # 引入,就像在 pg_hba.conf 里那样,允许嵌套 @ 构造。除非跟在 @ 后面的文件名是一个绝对路径,否则被当作与该文件所在目录相对的路径。

因为认证时系统是为每个连接请求顺序检查 pg_hba.conf 里的记录的,所以这些记录的顺序是非常关键的。通常,靠前的记录有比较严的连接匹配参数和比较弱的认证方法,而靠后的记录有比较松的匹配参数和比较严的认证方法。比如,我们一般都希望对本地 TCP/IP 连接使用 trust 认证,而对远端的 TCP/IP 连接要求口令。在这种情况下我们将trust 认证方法用于来自 127.0.0.1 的连接,这条记录将出现在允许更广泛的客户端 IP 地址的使用口令认证的记录前面。

在启动和主服务器进程收到 SIGHUP 信号的时候,系统都会重新装载 pg_hba.conf 文件。如果你在活跃的系统上编辑了该文件,就必须通知服务器(使用 pg_ctl reload 或kill -HUP)重新加载该文件。

【提示】一个用户要想成功连接到特定的数据库,不仅需要通过 pg_hba.conf 的检查,还必须要有该数据库上的 CONNECT 权限。如果希望限制哪些用户能够连接到哪些数据库,赋予/撤销 CONNECT 权限通常比在 pg_hba.conf 中设置规则简单。

例20-1里是 pg_hba.conf 记录的一些例子。阅读下文理解不同认证方法的细节。


例20-1. pg_hba.conf 记录的例子

# Allow any user on the local system to connect to any database under
# 允许在本机上的任何用户使用 Unix 域套接字(本地连接的缺省)以任何数据库用户身份连接任何数据库
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
local   all         all                               trust

# 和上面相同,但是使用的是回环的(loopback)TCP/IP 连接
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         127.0.0.1/32          trust     

# 和上面一行相同,但是用的是独立的掩码字段
# TYPE  DATABASE    USER        IP-ADDRESS    IP-MASK             METHOD
host    all         all         127.0.0.1     255.255.255.255     trust     

# 允许 IP 地址为 192.168.93.x 的任何主机与 "postgres" 数据库相连,
# 用与他们在自己的主机上相同 ident 的用户名标识他自己(通常是他的 Unix 用户名)
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    postgres    all         192.168.93.0/24       ident sameuser

# 允许来自主机 192.168.12.10 的用户提供了正确的口令之后与 "postgres" 数据库连接。
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    postgres    all         192.168.12.10/32      md5

# 如果前面没有其它 "host" 行,那么下面两行将拒绝所有来自 192.168.54.1 的连接请求(因为前面的记录先匹配)。
# 但是允许来自互联网上其它任何地方的有效的 Kerberos 5 认证的连接。
# 零掩码表示不考虑主机 IP 的任何位。因此它匹配任何主机。
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         192.168.54.1/32       reject
host    all         all         0.0.0.0/0             krb5

# 允许来自 192.168.x.x 的任何用户与任意数据库连接,只要他们通过 ident 检查。
# 但如果 ident 说该用户是 "bryanh" 且他要求以 PostgreSQL 用户 "guest1" 连接,
# 那么只有在 pg_ident.conf 里有 "omicron" 的映射说 "bryanh" 允许以 "guest1" 进行连接时才真正可以进行连接。
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         192.168.0.0/16        ident omicron

# 如果下面是用于本地连接的仅有的三行,那么它们将允许本地用户只和同名数据库连接。
# 只有管理员和 "support" 角色里的成员例外,他们可以连接到任何数据库。
# $PGDATA/admins 文件列出了那些允许与所有数据库连接的用户名。
# 在所有情况下都需要口令。
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
local   sameuser    all                               md5
local   all         @admins                           md5
local   all         +support                          md5

# 上面最后两行可以合起来写成一行
local   all         @admins,+support                  md5

# 数据库字段也可以使用列表和文件名:
local   db1,db2,@demodbs  all                         md5



本文选自:《PostgreSQL 8.2.3 中文文档》


本文转载自:http://works.jinbuguo.com/postgresql/menu823/auth-pg-hba-conf.html

共有 人打赏支持
Goopand
粉丝 12
博文 436
码字总数 236906
作品 0
朝阳
私信 提问
windows下用pgadmin连接ubuntu内的postgreSQL服务器[转]

昨天晚上为了做点东西要在虚拟机里的ubuntu下安装postgres,为了操作方便所以在windows下安装了pgadmin3,但是连接的时候一直连接不上,仔细检查各个配置都没有问题,最后终于找到问题的所在...

乌鸦FB
2014/01/02
0
0
PostgreSQL 远程链接 Sever端配置

PostgreSQL Sever需要配置才可被用户远程链接 配置文件: pghba.conf 控制访问安全,管理客户端访问PostgreSQL server的访问权限。 postgresql.conf 数据库参数文件,配置数据库相关参数。 ...

唐修
2018/12/10
0
0
PostgreSQL DBA快速入门(一) - 准备和部署

PostgreSQL DBA快速入门(一): 准备和部署 MySQL和PostgreSQL - 两大开源对象关系型数据库管理系统,每一个都有大量的粉丝。这么多年来,在PostgreSQL社区中MySQL一直被消遣:默认松散的SQL...

闻术苑
2018/07/30
0
0
fedora 20中安装postgresql数据库

在fedora 20中在我2014-8-27日安装pg时,pg版本是9.3.5.1我不知是会由pg开发组自动更新还是别的,但安装后一般是最新的版本了。安装: yum install postgresql yum install postgresql-serv...

上海李浩
2014/08/27
0
1
如何在Debian 9上安装PostgreSQL

PostgreSQL,通常简称为Postgres,是一种开源的通用对象 - 关系数据库管理系统。 PostgreSQL具有许多高级功能,如在线备份,即时恢复,嵌套事务,SQL和JSON查询,多版本并发控制(MVCC),异...

dragon_tech
2018/11/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【机器学习PAI实战】—— 玩转人工智能之商品价格预测

摘要: 我们经常思考机器学习,深度学习,以至于人工智能给我们带来什么?在数据相对充足,足够真实的情况下,好的学习模型可以发现事件本身的内在规则,内在联系。我们去除冗余的信息,可以...

zhaowei121
11分钟前
0
0
Spring拓展接口之FactoryBean,我们来看看其源码实现

是什么 FactoryBean的源码比较简单,大家可以细读下其注释,我做了简单的如下翻译 /** * 实现此接口的bean不能用作普通bean。此bean暴露的对象是通过getObject()创建的对象,而不是它自身...

java菜分享
15分钟前
1
0
Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用...

阿里云官方博客
21分钟前
0
0
深入理解 Hive 分区分桶 (Inceptor)

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查...

hblt-j
29分钟前
0
0
数据结构

什么是数据结构 1、数据 数据是描述客观世界的数字、字符以及一切能够输入到计算机中,并且能够被计算机程序处理的符号集合。简言之,数据就是计算机加工处理的原料,是信息的载体。 2、数据...

stars永恒
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部