PG防火墙配置文件pg_hba.conf介绍
Tags: PGpg_hba.conf体系结构参数文件
注意:防火墙
$PGDATA/pg_hba.conf
文件和密码~/.pgpass
文件的优先级是:先通过pg_hba.conf校验,若需要密码再去校验.pgpass文件。
该文件位于初始化安装的数据库目录下,例如:/var/lib/pgsql/11/data/pg_hba.conf,配置示例如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 | cat << EOF > /var/lib/pgsql/11/data/pg_hba.conf # TYPE DATABASE USER ADDRESS METHOD local all all trust host all all ::1/128 trust host all all 127.0.0.1/32 trust host all all 0.0.0.0/0 md5 host replication all 0.0.0.0/0 md5 EOF -- 远程访问,也可以直接加上 host all all all md5 |
可以通过视图pg_hba_file_rules来查询该文件的内容(PG10新增)。pg_hba.conf修改后,使用pg_ctl reload重新读取pg_hba.conf文件。
1 2 3 4 5 6 7 8 9 | postgres=# select * from pg_hba_file_rules; line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+-------+---------------+-----------+-----------+-----------------------------------------+-------------+---------+------- 2 | local | {all} | {all} | | | trust | | 3 | host | {all} | {all} | ::1 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | trust | | 4 | host | {all} | {all} | 127.0.0.1 | 255.255.255.255 | trust | | 5 | host | {all} | {all} | 0.0.0.0 | 0.0.0.0 | md5 | | 6 | host | {replication} | {all} | 0.0.0.0 | 0.0.0.0 | md5 | | (5 rows) |
每一行的格式为:
连接方式 连接的数据库 连接的用户 连接的主机IP 认证方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust # 禁止超级用户从远程连接 host all postgres 0.0.0.0/0 reject # 应用连接配置:哪个用户,从哪里来,连接什么数据库。规则为使用何种认证方法,或拒绝? # TYPE DATABASE USER ADDRESS METHOD # 如果不想挨个配置,可以使用如下配置,允许所有来源,通过任意用户访问任意数据库 host all all 0.0.0.0/0 md5 # 或者 host all all all md5 |
TYPE 参数设置
TYPE 表示主机类型,值可能为:
若为 local
表示是unix-domain的socket连接,
若为 host
是TCP/IP socket
若为 hostssl
是SSL加密的TCP/IP socket
DATABASE 参数设置
DATABASE 表示数据库名称,值可能为:all
,sameuser
,samerole
,replication
,数据库名称
,或者多个
数据库名称用 逗号
,注意ALL不匹配 replication
USER 参数设置
USER 表示用户名称,值可以为:all
,一个用户名
,一组用户名
,多个用户时,可以用 ,
逗号隔开, 或者在用户名称前缀 +
在USER和DATABASE字段,也可以写一个单独的 文件名称用 @
前缀,该文件包含数据库名称或用户名称
ADDRESS 参数设置
该参数可以为 主机名称
或者IP/32(IPV4)
或 IP/128(IPV6)
,主机名称以 .
开头,samehost
或samenet
匹配任意Ip地址
METHOD 参数设置
该值可以为"trust", "reject", "md5", "password", "scram-sha-256","gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert"
常用的认证方法有:
trust:无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject:联接无条件拒绝,常用于从一个组中"过滤"某些主机。
md5:要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
password:和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。注意:若为password
则发送的为明文密码。
ident是Linux下PostgreSQL默认的local认证方式,凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。用户映射文件为pg_ident.conf,这个文件记录着与操作系统用户匹配的数据库用户,如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。比如,服务器上有名为user1的操作系统用户,同时数据库上也有同名的数据库用户,user1登录操作系统后可以直接输入psql,以user1数据库用户身份登录数据库且不需密码。很多初学者都会遇到psql -U username登录数据库却出现“username ident 认证失败”的错误,明明数据库用户已经createuser。原因就在于此,使用了ident认证方式,却没有同名的操作系统用户或没有相应的映射用户。解决方案:1、在pg_ident.conf中添加映射用户;2、改变认证方式。
注意
修改该配置文件中的参数,必须重启postgreSql
服务。若要允许其它IP地址访问该主机数据库,则必须修改
postgresql.conf
中的参数listen_addresses
为 `
重启:pg_ctl reload 或者 执行 SELECT pg_reload_conf()
示例
1 2 | # TYPE DATABASE USER ADDRESS METHOD host all all 10.10.56.17/32 md5 |
参数说明
host 参数表示安装PostgreSQL的主机
all 第一个all 表示该主机上的所有数据库实例
all 第二个all 表示所有用户
10.10.56.17/32 表示需要连接到主机的IP地址,32表示IPV4
md5 表示验证方式
即上述表示允许IP地址为10.10.56.17的所有用户可以通过MD5的密码验证方式连接主机上所有的数据库
也可以指定具体的数据库名称和 用户
1 2 | # TYPE DATABASE USER ADDRESS METHOD host test pgtest 10.10.56.17/32 md5 |
即表示允许地址为 10.10.56.17 的用户 pgtest通过 MD5方式 加密的密码方式连接主机上的 test 数据库
也可以指定整个网段
1 2 3 | # TYPE DATABASE USER ADDRESS METHOD host test pgtest 0.0.0.0/0 md5 |
即表示允许 任意iP 通过用户名为 pgtest 和md5的 密码 验证方式连接主机上 test 的数据库
不进行密码验证
1 2 3 | # TYPE DATABASE USER ADDRESS METHOD host test pgtest 0.0.0.0/0 trust |
表示任意IP地址的用户 pgtest 无需密码验证可直接连接访问该主机的 test 数据库