前面介绍了 PostgreSQL 基础概念及安装部署、目录结构与配置文件 postgresql.conf 详解、常用管理命令相关的知识点,今天我将详细的为大家介绍 PostgreSQL 访问控制与认证 相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!
PostgreSql 连接访问控制
概述
PostgreSql 数据库安装完成后,再需要做一些配置,才可以正常访问。一般需要修改 postgresql.conf
,pg_hba.conf
配置文件,有其他特殊需求的,可能还需要修改 pg_ident.conf
配置文件。
配置文件修改
postgresql.conf 文件
数据库集簇安装部署完成后,要更改其中的监听地址,否则默认只监听数据库服务器本地 localhost 地址。另外确保监听的端口号要通畅,不被防火墙或其他网络安全策略所限制,默认端口号 5432。
-
listen_addresses =
'*'
-
port =
5866
pg_hba.conf 文件
数据库集簇安装部署完成后,默认只允许本地连接,且连接认证方式均为 trust,生产环境建议更改为 md5 连接认证方式,并根据需求增加允许访问的客户端地址。
-
# TYPE DATABASE USER ADDRESS METHOD
-
local all all md5
-
host all all
127.0
.0
.1/
32 md5
-
host all all
0.0
.0
.0/
0 md5
-
host all all ::
1/
128 md5
-
local replication all md5
-
host replication all
127.0
.0
.1/
32 md5
-
host replication all ::
1/
128 md5
TYPE,数据库连接方式,有如下四种
local:匹配使用Unix域套接字的连接,如果没有此类型的记录,则不允许使用Unix域套接字连接。
host:匹配使用TCP/IP进行的连接,主机记录匹配SSL或非SSL连接,需要配置listen_addresses。
hostssl:匹配使用TCP/IP进行的连接,仅限于使用SSL加密进行连接,需要配置ssl参数。
hostnossl:匹配通过TCP/IP进行的连接,不使用SSL的连接。
DATABASE:指定哪些数据库可以被连接
匹配的数据库名称,all 指定它匹配所有数据库。
复制(replication)不指定数据库。
多个数据库可以用逗号分隔。
USER:指定哪些用户可以连接
匹配的数据库用户名,all 指定它匹配所有用户。
可以通过用逗号分隔来提供多个用户名。
ADDRESS:指定哪些IP地址可以连接
匹配的客户端计算机地址,all 匹配任何 IP 地址。
0.0.0.0/0 表示所有 IPv4 地址。
:: 0/0 表示所有 IPv6 地址。
192.168.100.101/32 允许这个 ip 登录。
192.168.100.0/24 允许 19.168.100.0~192.168.100.255 网段登录数据库
METHOD:客户端认证方式
trust:只要知道数据库用户名就不需要密码或ident就能登录,建议不要在生产环境中使用。
am-sha-256:密码认证,这是当前提供的方法中最安全的一种,但是旧的客户端库不支持这种方法。
md5:是常用的密码认证方式,如果你不使用ident,最好使用md5。密码是以md5形式传送给数据库,较安全,且不需建立同名的操作系统用户。
password:以明文密码传送给数据库,建议不要在生产环境中使用。
ident:Linux下PostgreSQL默认的local认证方式,凡是能正确登录操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。操作系统名,数据库用户名,数据库名一致。
reject:拒绝认证,这对于从组中“过滤掉”某些主机非常有用。
修改完pg_hba.conf文件之后,需要重新加载配置,不用重启数据库:
--系统命令行执行 pg_ctl reload
或
-
--连入数据库执行
-
select pg_reload_conf();
更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。
pg_ident.conf 文件
数据库映射文件,ident 认证方式的扩展,标注操作系统用户与数据库用户的映射关系,配合pg_hba.conf 使用。允许数据库服务器上指定的操作系统用户,使用指定的数据库用户,免密连入数据库。
-
pg_ident.conf 文件
-
# MAPNAME SYSTEM-USERNAME PG-USERNAME
-
ss aaa test
-
ss syd syd
-
-
pg_hba.conf 文件
-
# TYPE DATABASE USER ADDRESS METHOD
-
local all all ident
map=ss
-
host all all
127.0
.0
.1/
32 md5
-
host all all
0.0
.0
.0/
0 md5
-
host all all ::
1/
128 md5
-
local replication all md5
-
host replication all
127.0
.0
.1/
32 md5
-
host replication all ::
1/
128 md5
MAPNAME:映射名,自定义配置在 pg_hba.conf 文件中。
SYSTEM-USERNAME:系统用户名。
PG-USERNAME :数据库用户名。
示例:
-
--aaa 操作系统用户,使用 test 数据库用户,免密连入数据库。
-
[root@dj ~]# su - aaa
-
[aaa@dj ~]$ psql -U test
-
psql (
12.4)
-
Type
"help"
for help.
-
test=>
select user;
-
user
-
------
-
test
-
(
1 row)
-
-
--syd 操作系统用户,使用 syd 数据库用户,免密连入数据库
-
[root@dj ~]# su - syd
-
[syd@dj ~]$ psql -U syd
-
psql (
12.4)
-
Type
"help"
for help.
-
syd=>
select user;
-
user
-
------
-
syd
-
(
1 row)
PostgreSql 认证方式 Peer 认证
Peer 认证方法通过从内核获得客户端的操作系统用户名并把它用作被允许的数据库用户名(和可选的用户名映射)来工作。这种方法只在本地连接上支持。
Peer 认证只在提供getpeereid()函数、SO_PEERCRED套接字参数或相似机制的操作系统上可用。这些 OS 当前包括Linux、大部分的BSD包括OS X以及Solaris。
配置示例
数据库服务器配置参数文件
-
pg_ident.conf 文件
-
# MAPNAME SYSTEM-USERNAME PG-USERNAME
-
ss aaa test
-
ss syd syd
-
-
pg_hba.conf 文件
-
# TYPE DATABASE USER ADDRESS METHOD
-
local all all peer
map=ss
-
host all all
127.0
.0
.1/
32 md5
-
host all all
0.0
.0
.0/
0 md5
-
host all all ::
1/
128 md5
-
local replication all md5
-
host replication all
127.0
.0
.1/
32 md5
-
host replication all ::
1/
128 md5
-
-
重新加载即可生效
-
pg_ctl reload
MAPNAME:映射名,自定义配置在 pg_hba.conf 文件中。
SYSTEM-USERNAME:系统用户名。
PG-USERNAME :数据库用户名。
数据库服务器本地测试连接
-
--aaa 操作系统用户,使用 test 数据库用户,免密连入数据库。
-
[root@dj ~]# su - aaa
-
[aaa@dj ~]$ psql -U test
-
psql (
12.4)
-
Type
"help"
for help.
-
test=>
select user;
-
user
-
------
-
test
-
(
1 row)
-
-
--syd 操作系统用户,使用 syd 数据库用户,免密连入数据库
-
[root@dj ~]# su - syd
-
[syd@dj ~]$ psql -U syd
-
psql (
12.4)
-
Type
"help"
for help.
-
syd=>
select user;
-
user
-
------
-
syd
-
(
1 row)
更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。
PostgreSql 认证方式 Idnet 认证
ident 认证方法通过从一个 ident 服务器获得客户端的操作系统用户名并且用它作为被允许的数据库用户名(和可选的用户名映射)来工作。它只在 TCP/IP 连接上支持。
当为一个本地(非 TCP/IP)连接指定 ident 时,将实际使用 peer 认证。
“Identification Protocol(标识协议)”在 RFC 1413 中描述。实际上每个类 Unix 操作系统都带着一个默认监听 TCP 113 端口的 ident 服务器。ident 服务器的基本功能是回答类似这样的问题:“哪个用户从你的端口X发起了连接并且连到了我的端口Y?” 。
因为当一个物理连接被建立后,PostgreSQL既知道X也知道Y, 所以它可以询问尝试连接的客户端主机上的 ident 服务器并且在理论上可以判断任意给定连接的操作系统用户。简单来说,ident 服务能够告知 socket 被连接端当前操作系统用户信息。
这个过程的缺点是它依赖于客户端的完整性:如果客户端机器不可信或者被攻破,攻击者可能在 113 端口上运行任何程序并且返回他们选择的任何用户。因此这种认证方法只适用于封闭的网络, 这样的网络中的每台客户端机器都处于严密的控制下并且数据库和操作系统管理员操作时可以方便地联系。换句话说,你必须信任运行 ident 服务器的机器。
配置示例
数据库服务器配置参数文件
-
pg_ident.conf 文件
-
# MAPNAME SYSTEM-USERNAME PG-USERNAME
-
ss aaa test
-
ss syd syd
-
-
pg_hba.conf 文件
-
# TYPE DATABASE USER ADDRESS METHOD
-
local all all md5
-
host all all
127.0
.0
.1/
32 md5
-
host all all
0.0
.0
.0/
0 idnet
map=ss
-
host all all ::
1/
128 md5
-
local replication all md5
-
host replication all
127.0
.0
.1/
32 md5
-
host replication all ::
1/
128 md5
-
-
重新加载即可生效
-
pg_ctl reload
MAPNAME:映射名,自定义配置在 pg_hba.conf 文件中。
SYSTEM-USERNAME:系统用户名。
PG-USERNAME :数据库用户名。
客户端配置并测试连接
客户端服务器要装有 PostgreSql 数据库客户端,可通过命令行方式连接远程服务器端的数据库。
-
--linux 客户端安装 oidentd,并启动该服务
-
yum -y install epel-release
-
yum clean all && yum makecache
-
yum install -y oidentd
-
systemctl start oidentd.service
-
systemctl status oidentd.service
-
-
--开放防火墙端口或关闭防火墙
-
firewall-cmd --add-port=
113/tcp
-
firewall-cmd --permanent --add-port=
113/tcp
-
firewall-cmd --reload
-
firewall-cmd --list-ports | grep
113
-
-
systemctl stop firewalld.service
-
systemctl status firewalld.service
-
systemctl disable firewalld.service
-
--aaa 操作系统用户,使用 test 数据库用户,免密连入数据库。
-
[root@dj ~]# su - aaa
-
[aaa@dj ~]$ psql -U test -h
192.168
.100
.10 -p
5432
-
psql (
12.4)
-
Type
"help"
for help.
-
test=>
select user;
-
user
-
------
-
test
-
(
1 row)
-
-
--syd 操作系统用户,使用 syd 数据库用户,免密连入数据库
-
[root@dj ~]# su - syd
-
[syd@dj ~]$ psql -U syd -h
192.168
.100
.10 -p
5432
-
psql (
12.4)
-
Type
"help"
for help.
-
syd=>
select user;
-
user
-
------
-
syd
-
(
1 row)
我们通过访问控制、认证来控制不同的数据库实例可以供不同的外部用户来访问,相当于构筑了一道防火墙。更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。
参考文章:https://blog.csdn.net/songyundong1993/
category_11329151.html