Postgresql配置文件_第1页
Postgresql配置文件_第2页
Postgresql配置文件_第3页
Postgresql配置文件_第4页
Postgresql配置文件_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、相比mysql单一的f,postgresql的访问认证配置主要涉及到两个主要的配置文件:postgresql.conf和 pg_hba.conf,本文从安全设置角度讲述这两个配置文件的配置选项。部分文字、样例摘抄自postgresql的中文手册。postgresql.confpostgresql.conf包含了许多的选项,这些选项控制了postgresql.conf的方方面面,中间影响访问认证的选项是:unix_socket_group设置 Unix 域套接字的组所有人,(套接字的所有权用户总是启动 postmaster 的用户)与 UNIX_SOCKET_PERMISSIONS 选项一起使用

2、可以给这种套接字类型增加额外的访问控制机制,缺省时是一个空字串,也就是使用当前用户的缺省的组, 这个选项只能在服务器启动时设置。unix_socket_permissions给 Unix 域套接字设置访问权限,Unix 域套接字使用通常的 Unix 文件系统权限集。可选的值可以是一个 chmod 和 umask 系统调用可以接受的数字模式。(要使用客户化的八进制格式,该数字必须以 0 (零)开头)缺省权限是 0777,意即任何人都可以联接,合理的选则可能是0770 (只有用户和组, 参阅UNIX_SOCKET_GROUP)和 0700 (只有用户)。(请注意对于 Unix 套接字而言,实际上只

3、有写权限有意义,而且 也没有办法设置或者取消读或执行权限)这个选项只能在服务器启动时设置。pg_hba.conf是设置访问认证的主要文件,格式为每条记录一行,每行指定一条访问认证。设定一条访问认证包含了7个部分:连接方式(type)、数据库(database)、用户名(user)、ip地址(ip-address)、子网掩码(ip-mask)、认证方法(authentication method)、认证配置(authentication-option),以下是这7个部分的详细说明:连接方式(type)连接方式共有三种:local、host、hostssllocal这条记录匹配通过 Unix 域套

4、接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。host这条记录匹配通过 TCP/IP 网络进行的联接尝试,请注意,除非服务器是 带着 -i 选项或者打开了 postgresql.conf 里面的 tcpip_socket 配置参数集启动的,否则 TCP/IP 联接是被禁止掉的。hostssl这条记录匹配通过在 TCP/IP 上进行的 SSL 联接企图, host 记录可以匹配 SSL 和非 SSL 的联接企图, 但 hostssl 记录需要 SSL 联接。数据库(database)声明记录所匹配的数据库。值 all 表明该记录匹配所有数据库, 值 sameuse

5、r表示如果被请求的数据库和请求的用户同名,则匹配。 samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。 在其他情况里,这就是一个特定的 PostgreSQL 的名字。我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以 通过对该文件前缀 来声明该文件必需和 pg_hba.conf 在同一个目录。用户名(user)为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,组名字 可以通过用 + 做组名字前缀来声明。一个包含用户名的文件可

6、以 通过在文件名前面前缀 来声明,该文件必需和 pg_hba.conf 在同一个目录。ip地址(ip-address)子网掩码(ip-mask)这两个字段包含标准的点分十进制表示的 IP地址/掩码值。 (IP地址只能用数字的方式声明,而不能用域名或者主机名)它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址。 准确的逻辑是:(actual-IP-address xor IP-address-field) and IP-mask-field对于要匹配的记录必需为零。如果连接方式是host或者hostssl的话,这两项必须指定,否则可以不填。认证方法(authentication metho

7、d)trust无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。reject联接无条件拒绝,常用于从一个组中过滤某些主机。md5要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。crypt类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端,对于 7.2 以及以后的客户端,我们建议使用 md5。password和md5一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这

8、个方式。krb4用 Kerberos V4 认证用户,只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos,克尔波洛斯,故希腊神话冥王哈得斯的多头看门狗,FF8中“反击的狼烟”。Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥交换方法,其特点是需要两个不同用途的服务器,一个用于认证身份,一个用于通道两端用户的密钥交换。同时 Kerberos 对网络时间同步要求比较高,以防止回放攻击,因此通常伴随 NTP 服务。)krb5用 Kerberos V5 认证用户只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos V5 是上面 V4 的改良

9、,主要是不再依赖 DES 算法, 同时增加了一些新特性。)ident获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。如果你使用了 sameuser 映射,那么假设用户名是相等的。如果没有声明这个关键字,则在 $PGDATA/pg_ident.conf 文件中找出映射名。如果这个文件里包含一条记录标识着ident提供的用户名 和请求的 PostgreSQL 用户名的映射, 那么联接

10、被接受。对于本地联接,只有在系统支持Unix域套接字信任证的情况下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。pam使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules) (PAM)来认证。认证配置(authentication-option)这个可选的字段的含义取决与选择的认证方法。了解了以上的内容以后,我们可以开始设置自己的访问认证。和mysql一样,postgresql默认安装的访问认证是不安全的,当我第一次安装好我的 postgresql以后,我发现只要输入psql -U pgsql -d

11、 template1就可以不需要任何密码的进入我的数据库,并且使用的是pgsql用户(数据库的最高权限),即使在我使用ALTER USER为我的数据库用户添加了密码以后情况也没有得到改善,经过一番查找,我发现我的pg_hba.conf内容如下:local all all trusthost all all 0.0.0.0 0.0.0.0 trust这说明无论在本地还是通过tcp/ip,任何人都可以不加任何限制的使用任何他想用的身份访问我的数据库,于是我为所有的访问都使用了md5认证方法,我的pg_hba.conf变为:local all all md5host all all 0.0.0.0

12、0.0.0.0 md5事情似乎得到了解决,任何人想访问我的数据库都需要通过密码这一关,我的数据库安全了。但是当我有一天重新启动计算机的以后发现我的 postgresql并没有被正常的启动,在终端前我发现启动到postgresql服务启动脚本时,提示需要输入密码,原来在设置了md5认证方式以后我的pgsql需要密码才能够启动服务,为了不每次启动都跑到终端前去输入一次密码,我的pgsql用户的认证方法必须为trust:local pgsql all trustlocal all all md5host all all 0.0.0.0 0.0.0.0 md5在随后的检测中我发现,虽然通过网络得到了保

13、护,但是如果在本地通过Unix域套接字进行连接的话,任何人都还是可以使用psql -U pgsql -d template1的方式轻松的进入我的数据库,这样做显而易见不是我想要的结果,现在我需要unix_socket_permissions的协助,当我把这个项设置为0700以后,就只有套接字的所有人,即系统用户pgsql可以使用套接字进行连接,另外如果我的数据库有几个管理员需要最高权限的话,0770也是一个选择,不过暂时只有我一个管理员,所以我选择了0700,现在我的pg_hba.conf改变为:local pgsql all trusthost all all 0.0.0.0 0.0.0.0

14、 md5结合了unix_socket_permissions以后,现在只有系统用户pgsql可以无任何限制的连接(当然,伟大的root例外),并且我也不用每次启动的时候都跑到终端前去输入一次密码了,而其他人只能通过网络连接,即使登录到了本地计算机上,其他用户也只能使用psql -U xx -d template1 -h 127.0.0.1的方式连接,这种连接是受到密码认证的保护的,这一切正是我想要的。pg_hda.conf看看pg_hda.conf的:# TYPE DATABASE USER CIDR-ADDRESS METHOD顺序一定不要搞错了,我的前面关于认证设置的文章是网上照搬的,将d

15、atabase和user顺序设反了,导致我一直出现错误。汗颜!注意到type:包含local和host两种。意思是本机(local)和远程调用(host)对于一个user,最好给本机和远程都给权限。然后看method:有trust(不需要安全认证);md5(md5加密认证);password(明码认证)。依然存在问题:我对用户使用md5和password方式,使用psql命令输入密码都提示密码错误。不知道是什么原因。问题分析中。待续eg:对globus用户,rftDatabase数据库的授权:local all globus trusthost rftDatabase globus 202.1

16、98.30.65 255.255.255.128 trust这个是保证GT4的container和使用psql命令都能简单进入的方式,不过使用password和md5方式就出现错误了。顺便说一句,container联接数据库的配置文件是:$GLOBUS_LOCATION/etc/globus_wsrf_rft/jndi-config.xml在dbConnection部分指定数据库,用户名和密码。pg_hba.conf 文件客户端认证是由一个配置文件控制的,通常其文件名是 pg_hba.conf, 存放在数据库集群的数据目录里。 (HBA 的意思是 host-based authenticati

17、on:基于主机的认证。) 在initdb初始化数据目录的时候,它会安装一个缺省的文件。 不过我们也可以把认证配置文件放在其它地方;参阅 hba_file 配置参数。文件 pg_hba.conf 的常用格式是一套记录, 每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。 一条记录是由若干用空格和/或 tab 分隔的字段组成。 如果字段用引号包围,那么它可以包含空白。记录不能跨行存在。每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字, 以及对匹配这些参数的联接使用的认证方法。 第一条匹配联接类型,客户端地址和联接企图请求的数据库名

18、和用户名的记录将用于执行认证。 这个处理过程没有跨越或者回头的说法:如果选择了一条记录而且认证失败, 那么将不考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。每条记录可以下面七种格式之一local database user auth-method auth-optionhost database user CIDR-address auth-method auth-optionhostssl database user CIDR-address auth-method auth-optionhostnossl database user CIDR-address auth-method

19、 auth-optionhost database user IP-address IP-mask auth-method auth-optionhostssl database user IP-address IP-mask auth-method auth-optionhostnossl database user IP-address IP-mask auth-method auth-option各个字段的含义如下:local这条记录匹配通过 Unix 域套接字进行的联接企图。 没有这种类型的记录,就不允许 Unix 域套接字的联接。host这条记录匹配通过 TCP/IP 进行的联接尝试

20、。 host 记录匹配 SSL 和非 SSL 的连接请求。注意: 除非服务器带着合适的 listen_addresses 配置参数值启动,否则将不可能进行远程的 TCP/IP 连接, 因为缺省的行为是只监听本地自环地址 localhost 的连接。hostssl这条记录匹配使用 TCP/IP 的 SSL 联接企图。 但必须是使用 SSL 加密的联接。要使用这个选项,制作服务器的时候必须打开 SSL 支持。而且在服务器启动的时候, 必须SSL选项通过配置选项ssl打开。 hostnossl这个记录与 hostssl 有着正相反的逻辑: 它只匹配那些在 TCP/IP 上不使用 SSL 的连接请求。

21、database声明记录所匹配的数据库名称。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samerole 表示请求的用户必须是一个与数据库同名的组中的成员。 (samegroup 是一个已经废弃了的,但仍然被接受的 samerole 的同义词。) 在其他情况里,这就是一个特定的 PostgreSQL 的名字。 我们可以通过用逗号分隔的方法声明多个数据库。 可以通过对该文件前缀 来声明一个独立的包含数据库名的文件。user为这条记录声明所匹配的数据库用户。值 all 表明它匹配于所有用户。 否则,它就是特定数据库用户的名字。或者是

22、一个前缀 + 的组名称。 (请注意,在 PostgreSQL 里,用户和组没有真正的区别, + 实际上只是意味着匹配任何直接或者间接属于这个角色的成员, 而没有 + 记号的名字只匹配指定的角色。) 多个用户名可以通过用逗号分隔的方法声明。 一个包含用户名的文件可以通过在文件名前面前缀 来声明。CIDR-address声明这条记录匹配的客户端机器的 IP 地址范围。它包含一个标准的点分十进制的 IP 地址和一个 CIDR 掩码长度。 (IP 地址只能用数值声明,不能用域或者主机名。) 掩码长度表示客户端 IP 地址必须匹配的高位二进制位数。 在给出的 IP 地址里,这个长度的右边的二进制位必须为

23、零。 在 IP 地址,/,和 CIDR 掩码长度之间不能有空白。典型的 CIDR 地址是 172.20.143.89/32,这表明一个主机, 或者 172.20.143.0/24 表示一个网络。 要声明单个主机,给 IPv4 地址声明 CIDR 掩码 32,给 IPv6 地址声明 128。以 IPv4 格式给出的 IP 地址会匹配那些拥有对应地址的 IPv6 连接,比如 127.0.0.1 将匹配 IPv6 地址 :ffff:127.0.0.1。 一个以 IPv6 格式给出的记录将只匹配 IPv6 连接,即使对应的地址在 IPv4-in-IPv6 范围内。请注意如果系统的 C 库不支持 IPv

24、6 地址,那么 IPv6 的格式将被拒绝。这个域只适用于 host,hostssl 和 hostnossl 记录。IP-addressIP-mask这些方法可以用于作为 CIDR-address 表示法的替补。 它不是声明掩码的长度,而是在另外一个字段里声明实际的掩码。 比如,255.0.0.0 表示 IPv4 CIDR 掩码长度 8,而 255.255.255.255 表示 CIDR 掩码长度 32。 同样的匹配逻辑将用于一个点分的 IP-mask。这些字段只适用于 host, hostssl, 和 hostnossl 记录。auth-method(认证方法)声明通过这条记录联接的时候使用的

25、认证方法。 可能的选择在下面简介。trust无条件地允许联接。这个方法允许任何可以与PostgreSQL 数据库服务器联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。reject联接无条件拒绝。常用于从一个组中过滤某些主机。md5要求客户端提供一个 MD5 加密的口令进行认证 cryptNote: 这个选项只有在与 7.2 以前的客户端进行通讯的时候才建议使用。要求客户端提供一个 crypt() 加密的口令用于认证。 现在我们建议使用 md5。 password要求客户端提供一个未加密的口令进行认证。 因为口令是以明文形式在网络上传递的, 所以我们不应该

26、在不安全的网络上使用这个方式。 并且它通常还不能和线程化的客户端应用一起使用。krb5用 Kerberos V5 认证用户。只有在进行 TCP/IP 联接的时候才能用。 (译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。)ident获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。pam使用操作系统提供的可插入的认证模块服务

27、 (Pluggable Authentication Modules) (PAM)来认证auth-option这个可选的字段的含义取决与选择的认证方法。细节在下面。用 构造包含的文件是当作一列名字读取的, 这些名字可以用空白或者逗号分隔。注释用 # 引入, 就像在 pg_hba.conf 里那样,允许嵌套 构造。 除非跟在 后面的文件名是一个绝对路径,否则被当作与包含该文件的目录相对的路径。因为认证时系统是为每个联接请求顺序检查 pg_hba.conf 里的记录的,所以这些记录的顺序是非常关键的。 通常,靠前的记录有比较严的联接匹配参数和比较弱的 认证方法,而靠后的记录有比较松的匹配参数和比较

28、严的认证方法。 比如,我们一般都希望对本地 TCP/IP 联接使用 trust 认证, 而对远端的 TCP/IP 联接要求口令。在这种情况下我们将 trust 认证方法用于来自 127.0.0.1 的联接,这条记录将出现在允许更广泛的客户端 IP 地址的使用口令认证的记录前面。在启动和主服务器进程( postmaster )收到SIGHUP 信号的时候, 系统都会重新装载 pg_hba.conf 文件。 如果你在活跃的系统上编辑了该文件,你就需要用 kill 向 postmaster 发一个 SIGHUP信号,好让它重新读取该文件。在 Example 20-1 里是 pg_hba.conf 记

29、录的一些例子。 阅读下文理解不同认证方法的细节。Example 20-1. pg_hba.conf 记录的例子# 允许在本机上的任何用户使用 Unix 域套接字(本地连接的缺省)# 以任何数据库用户身份联接任何数据库# TYPE DATABASE USER CIDR-ADDRESS METHODlocal all all trust# 和上面相同,但是使用的是自环的(loopback)TCP/IP 连接# TYPE DATABASE USER CIDR-ADDRESS METHODhost all all 127.0.0.1/32 trust# 和上面一行相同,但是用的是独立的掩码字段# TYPE DATABASE USER IP-ADDRESS METHODhost all all 127.0.0.1 255.255.255.255 trust# 允许 IP 地址为 192.168.93.x 的任何主机与数据库# postgres 相连,用与他们在自己的主机上相同 ident 的用户名标识他自己# (通常是他的 Unix 用户名)# TYPE DATABASE USER CIDR-ADDRESS METHODhost postgres all 192.168.93.0/24 iden

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论