作者:风云再起2012668 | 来源:互联网 | 2014-05-28 15:41
在PostgreSQL数据库中,客户端想建立一个数据库连接,除了要提供正确的数据库用户名和密码,还要通过数据库的认证。如果不能通过数据库的认证,客户端的连接请求将被拒绝。客户端认证是PostgreSQL独有的特性,其它的数据库如Oracle没有这个概念。认证基于客户
在PostgreSQL数据库中,客户端想建立一个数据库连接,除了要提供正确的数据库用户名和密码,还要通过数据库的认证。如果不能通过数据库的认证,客户端的连接请求将被拒绝。客户端认证是PostgreSQL独有的特性,其它的数据库如Oracle没有这个概念。认证基于客户端所在的主机的IP地址、数据库用户名和要连接的数据库名。
通常情况一个客户端必须满足三个条件才能建立数据库连接:(1)提供正确的数据库用户名和密码。(2)通过认证。(3)连接数据库的用户在被连接的数据库上有CONNECT权限。如果客户端的认证方式是trust,则不需要提供数据库用户的密码,只需要提供数据库用户的名称。
4.1 pg_hba.conf文件
客户端认证的所有的配置信息都存放在文件pg_hba.conf中,该文件通常位于数据库文件所在的目录下。pg_hba.conf是一个普通的文本文件,该文件中每一行都是一条记录,以”#“打头的行被视为注释,将被忽略掉,空白行也会被忽略。每条记录由多个域构成,域之间用空格或制表符分开(Tab)。如果域的值含有空格,可以用引号将域的值引起来。单个记录不能跨行。
记录有下面的两种格式,一种以local打头,另一种以host打头。以local
打头的记录用来对使用Unix domain socket连接数据库的客户端进行认证。
如果没有pg_hba.conf文件中没有local类型的记录,所有试图通过Unix domain
socket连接数据库的请求都将被拒绝。以host打头的记录用来对使用TCP/IP协议连接数据库的客户端进行认证。
(1)local database user auth-method
(2)host database user CIDR-address
auth-method
database
表示该条记录匹配数据库名称。如果是all则匹配所有数据库。
User
表示该条记录匹配的数据库用户名。如果是all则匹配所有的数据库用户。
CIDR-address
表示该条记录匹配的客户端的IP地址的范围。它由一个标准的点分十进制表示的IP地址和一个CIDR掩码组成。
掩码的长度指明客户端IP地址必须匹配的高二进制位的个数。给定的IP地址的除去掩码长度指定的高二进制位以后剩下的二进制位必须是0。IP地址、符号“/“和CIDR掩码长度之间不能有任何空格。例如,CIDR地址172.20.143.89/32匹配单个主机172.20.143.89,172.20.143.0/24匹配所有IP地址以172.20.143打头的主机,10.6.0.0/16匹配所有以IP地址以10.6打头的主机,0.0.0.0/0匹配任何主机。如果只想匹配单个主机,对于IPV4,CIDR掩码长度应该是32,对于IPV6,CIDR掩码长度应该是128。
auth-method
表示匹配该条记录的连接请求的认证方法。它有四个取值,分别是trust、reject、md5和password。trust表示不需要提供密码就可以让客户端建立连接。reject表示不允许匹配该条记录的客户端建立连接。MD5表示客户端必须提供一个用MD5方法加密的密码。Password表示客户端必须提供一个没有加密的明文密码。
下面是一些pg_hba.conf文件记录实例:
(1)下面的记录允许本机上的所有客户端通过UNIX domain socket连接数据库而且不需要提供密码
local all all trust
(2)下面的记录允许任何远程机器上的客户端以任何数据库用户访问任何数据库,但是要提供数据库用户的密码
host all
all 0.0.0.0/0 password
(3)下面的记录拒绝IP地址为192.168.12.10的客户端用PostgreSQL用户访问任何数据库
host PostgreSQL
all 192.168.12.10/32 reject
4.2 注意事项
数据库启动时会将pg_hba.conf文件读入到内存中,如果在数据库运行的过程中修改了该文件,可以通过命令pg_ctl
reload通知数据库读入新的文件,新的配置文件一般会在一分钟以内生效,也可能要几分钟或更长的时间。
数据库在将pg_hba.conf文件读入到内存中时,不会校验文件中的记录的正确性。如果pg_hba.conf文件中有错误,该错误将在有客户端连接数据库时被检查出来,数据库日志中会有下面的提示信息:
日志: 文件"/home/postgres_bin/database/postgresql.conf"中有句法错误,在第8行末尾的附近。
数据库在收到客户端连接请求,在pg_hba.conf文件寻找与客户端匹配的认证记录时,总是以找到的第一条匹配的认证记录为准,pg_hba.conf文件中排在前面的认证记录比排在后面的认证记录的优先级高。如果pg_hba.conf文件中有两条记录匹配客户端连接请求,第一条记录拒绝客户端连接请求,第二条记录接受客户端连接请求,那么客户端连接请求将被拒绝。如果在pg_hba.conf文件中没有与客户端连接请求匹配的认证记录,该客户端连接请求也会被拒绝。