Postgresql配置文件
相比mysql单一的my.cnf,postgresql的访问认证配置主要涉及到两个主要的配置文件:postgresql.conf和 pg_hba.conf,本文从安全设置角度讲述这两个配置文件的配置选项。部分文字、样例摘抄自postgresql的中文
手册
华为质量管理手册 下载焊接手册下载团建手册下载团建手册下载ld手册下载
。
postgresql.conf
postgresql.conf包含了许多的选项,这些选项控制了postgresql.conf的方方面面,中间影响访问认证的选项是:
unix_socket_group
设置 Unix 域套接字的组所有人,(套接字的所有权用户总是启动 postmaster 的用户)与 UNIX_SOCKET_PERMISSIONS 选项一起使用可以给这种套接字类型增加额外的访问控制机制,缺省时是一个空字串,也就是使用当前用户的缺省的组, 这个选项只能在服务器启动时设置。
unix_socket_permissions
给 Unix 域套接字设置访问权限,Unix 域套接字使用通常的 Unix 文件系统权限集。可选的值可以是一个 chmod 和 umask 系统调用可以接受的数字模式。(要使用客户化的八进制格式,该数字必须以 0 (零)开头)
缺省权限是 0777,意即任何人都可以联接,合理的选则可能是0770 (只有用户和组, 参阅UNIX_SOCKET_GROUP)和 0700 (只有用户)。(请注意对于 Unix 套接字而言,实际上只有写权限有意义,而且 也没有办法设置或者取消读或执行权限)
这个选项只能在服务器启动时设置。
pg_hba.conf是设置访问认证的主要文件,格式为每条
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
一行,每行指定一条访问认证。设定一条访问认证包含了7个部分:连接方式(type)、数据库(database)、用户名(user)、ip地址(ip-address)、子网掩码(ip-mask)、认证方法(authentication method)、认证配置(authentication-option),以下是这7个部分的详细说明:
连接方式(type)
连接方式共有三种:local、host、hostssl
local
这条记录匹配通过 Unix 域套接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。
host
这条记录匹配通过 TCP/IP 网络进行的联接尝试,请注意,除非服务器是 带着 -i 选项或者打开了 postgresql.conf 里面的 tcpip_socket 配置参数集启动的,否则 TCP/IP 联接是被禁止掉的。
hostssl
这条记录匹配通过在 TCP/IP 上进行的 SSL 联接企图, host 记录可以匹配 SSL 和非 SSL 的联接企图, 但 hostssl 记录需要 SSL 联接。
数据库(database)
声明记录所匹配的数据库。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。 在其他情况里,这就是一个特定的 PostgreSQL 的名字。我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以 通过对该文件前缀 @ 来声明(该文件必需和 pg_hba.conf 在同一个目录。
用户名(user)
为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,组名字 可以通过用 + 做组名字前缀来声明。一个包含用户名的文件可以 通过在文件名前面前缀 @ 来声明,该文件必需和 pg_hba.conf 在同一个目录。
ip地址(ip-address)
子网掩码(ip-mask)
这两个字段包含
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的点分十进制表示的 IP地址/掩码值。 (IP地址只能用数字的方式声明,而不能用域名或者主机名)它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址。 准确的逻辑是:
(actual-IP-address xor IP-address-field) and IP-mask-field
对于要匹配的记录必需为零。
如果连接方式是host或者hostssl的话,这两项必须指定,否则可以不填。
认证方法(authentication method)
trust
无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期
望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject
联接无条件拒绝,常用于从一个组中"过滤"某些主机。
md5
要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
crypt
类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端,对于 7.2 以及以后的客户端,我们建议使用 md5。
password
和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
krb4
用 Kerberos V4 认证用户,只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos,"克尔波洛斯",故希腊神话冥王哈得斯的多头看门狗,FF8中“反击的狼烟”。Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥交换方法,其特点是需要两个不同用途的服务器,一个用于认证身份,一个用于通道两端用户的密钥交换。同时 Kerberos 对网络时间同步要求比较高,以防止回放攻击,因此通常伴随 NTP 服务。)
krb5
用 Kerberos V5 认证用户(只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。)
ident
获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。
如果你使用了 sameuser 映射,那么假设用户名是相等的。如果没有声明这个关键字,则在 $PGDATA/pg_ident.conf 文件中找出映射名。如果这个文件里包含一条记录
标识
采样口标识规范化 下载危险废物标识 下载医疗器械外包装标识图下载科目一标识图大全免费下载产品包装标识下载
着ident提供的用户名 和请求的 PostgreSQL 用户名的映射, 那么联接被接受。
对于本地联接,只有在系统支持Unix域套接字信任证的情况下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。
pam
使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules) (PAM)来认证。
认证配置(authentication-option)
这个可选的字段的含义取决与选择的认证方法。
了解了以上的内容以后,我们可以开始设置自己的访问认证。和mysql一样,postgresql默认安装的访问认证是不安全的,当我第一次安装好我的 postgresql以后,我发现只要输入`psql -U pgsql -d template1`就可以不需要任何密码的进入我的数据库,并且使用的是pgsql用户(数据库的最高权限),即使在我使用ALTER USER为我的数据库用户添加了密码以后情况也没有得到改善,经过一番查找,我发现我的pg_hba.conf内容如下:
local all all trust
host all all 0.0.0.0 0.0.0.0 trust
这说明无论在本地还是通过tcp/ip,任何人都可以不加任何限制的使用任何他想用的身份访问我的数据库,于是我为所有的访问都使用了md5认证方法,我的pg_hba.conf变为:
local all all md5
host all all 0.0.0.0 0.0.0.0 md5
事情似乎得到了解决,任何人想访问我的数据库都需要通过密码这一关,我的数据库安全了。但是当我有一天重新启动计算机的以后发现我的 postgresql并没有被正常的启动,在终端前我发现启动到postgresql服务启动脚本时,提示需要输入密码,原来在设置了md5认证方式以后我的pgsql需要密码才能够启动服务,为了不每次启动都跑到终端前去输入一次密码,我的pgsql用户的认证方法必须为trust:
local pgsql all trust
local all all md5
host all all 0.0.0.0 0.0.0.0 md5
在随后的检测中我发现,虽然通过网络得到了保护,但是如果在本地通过Unix域套接字进行连接的话,任何人都还是可以使用`psql -U pgsql -d template1`的方式轻松的进入我的数据库,这样做显而易见不是我想要的结果,现在我需要unix_socket_permissions的协助,当我把这个项设置为0700以后,就只有套接字的所有人,即系统用户pgsql可以使用套接字进行连接,另外如果我的数据库有几个管理员需要最高权限的话,0770也是一个选择,不过暂时只有我一个管理员,所以我选择了0700,现在我的pg_hba.conf改变为:
local pgsql all trust
host all all 0.0.0.0 0.0.0.0 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
顺序一定不要搞错了,我的前面关于认证设置的文章是网上照搬的,将database和user顺序设反了,导致我一直出现错误。汗颜~
注意到type:包含local和host两种。意思是本机(local)和远程调用(host)
对于一个user,最好给本机和远程都给权限。
然后看method:有trust(不需要安全认证);md5(md5加密认证);password(明码认证)。
依然存在问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
:我对用户使用md5和password方式,使用psql命令输入密码都提示密码错误。不知道是什么原因。问题分析中。待续~~~~~~~~~~~
eg:对globus用户,rftDatabase数据库的授权:
local all globus trust host rftDatabase globus 202.198.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 authentication:基于主机的认证。) 在initdb初始化数据目录的时候,它会安装一个缺省的文件。 不过我们也可以把认证配置文件放在其
它地方;参阅 hba_file 配置参数。
文件 pg_hba.conf 的常用格式是一套记录, 每行一条。空白行行被忽略,井号( # )开头
的注释也被忽略。 一条记录是由若干用空格和/或 tab 分隔的字段组成。 如果字段用引号
包围,那么它可以包含空白。记录不能跨行存在。
每条记录声明一种联接类型,一个客户端 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选项通过配置选项ssl打开。
hostnossl
这个记录与 hostssl 有着正相反的逻辑: 它只匹配那些在 TCP/IP 上不使用 SSL 的连接请
求。
database
声明记录所匹配的数据库名称。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samerole 表示请求的用户必须是一个与数据库同名的组中的成员。 (samegroup 是一个已经废弃了的,但仍然被接受的 samerole 的同义词。) 在其他情况里,这就是一个特定的 PostgreSQL 的名字。 我们可以通过用逗号分隔的方法声明多个数据库。 可以通过对该文件前缀 @ 来声明一个独立的包含数据库名的文件。
user
为这条记录声明所匹配的数据库用户。值 all 表明它匹配于所有用户。 否则,它就是特定数据库用户的名字。或者是一个前缀 + 的组名称。 (请注意,在 PostgreSQL 里,用户和组没有真正的区别, + 实际上只是意味着"匹配任何直接或者间接属于这个角色的成员", 而没有 + 记号的名字只匹配指定的角色。) 多个用户名可以通过用逗号分隔的方法声明。 一个包含用户名的文件可以通过在文件名前面前缀 @ 来声明。
CIDR-address
声明这条记录匹配的客户端机器的 IP 地址范围。它包含一个标准的点分十进制的 IP 地址和一个 CIDR 掩码长度。 (IP 地址只能用数值声明,不能用域或者主机名。) 掩码长度表示客户端 IP 地址必须匹配的高位二进制位数。 在给出的 IP 地址里,这个长度的右边的二进制位必须为零。 在 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 库不支持 IPv6 地址,那么 IPv6 的格式将被拒绝。
这个域只适用于 host,hostssl 和 hostnossl 记录。
IP-address
IP-mask
这些方法可以用于作为 CIDR-address 表示法的替补。 它不是声明掩码的长度,而是在另外一个字段里声明实际的掩码。 比如,255.0.0.0 表示 IPv4 CIDR 掩码长度 8,而 255.255.255.255 表示 CIDR 掩码长度 32。 同样的匹配逻辑将用于一个点分的 IP-mask。
这些字段只适用于 host, hostssl, 和 hostnossl 记录。
auth-method(认证方法)
声明通过这条记录联接的时候使用的认证方法。 可能的选择在下面简介。
trust
无条件地允许联接。这个方法允许任何可以与PostgreSQL 数据库服务器联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject
联接无条件拒绝。常用于从一个组中"过滤"某些主机。
md5
要求客户端提供一个 MD5 加密的口令进行认证
crypt
Note: 这个选项只有在与 7.2 以前的客户端进行通讯的时候才建议使用。
要求客户端提供一个 crypt() 加密的口令用于认证。 现在我们建议使用 md5。
password
要求客户端提供一个未加密的口令进行认证。 因为口令是以明文形式在网络上传递的, 所以我们不应该在不安全的网络上使用这个方式。 并且它通常还不能和线程化的客户端应用一起使用。
krb5
用 Kerberos V5 认证用户。只有在进行 TCP/IP 联接的时候才能用。 (译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。)
ident
获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。
pam
使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules) (PAM)来认证
auth-option
这个可选的字段的含义取决与选择的认证方法。细节在下面。
用 @ 构造包含的文件是当作一列名字读取的, 这些名字可以用空白或者逗号分隔。注释用 # 引入, 就像在 pg_hba.conf 里那样,允许嵌套 @ 构造。 除非跟在 @ 后面的文件
名是一个绝对路径,否则被当作与包含该文件的目录相对的路径。
因为认证时系统是为每个联接请求顺序检查 pg_hba.conf 里的记录的,所以这些记录的顺序
是非常关键的。 通常,靠前的记录有比较严的联接匹配参数和比较弱的 认证方法,而靠后
的记录有比较松的匹配参数和比较严的认证方法。 比如,我们一般都希望对本地 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 记录的一些例子。 阅读下文理解不同认证方法的细节。
Example 20-1. pg_hba.conf 记录的例子
# 允许在本机上的任何用户使用 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 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