PostgreSQL 认证方式

news/2024/7/9 21:32:08 标签: postgresql

一、概述

客户端的身份验证是由配置文件控制的,配置文件为pg_hba.conf,存放位置在数据目录下(show data_directory;)。
在initdb初始化数据目录时,会生成一个默认的pg_hba.conf文件。也可以将该配置文件存放在其他地方。
pg_hba.conf文件的常用格式是一组记录,每行一条。空白行和#注释字符后面的文本都将被忽略。
每条记录指定连接类型、客户端IP地址范围、数据库名称、用户名以及匹配这些参数连接使用的认证方法。
如果没有匹配的记录,访问将被拒绝。
还可以当作黑白名单访问控制文件,可以限制某些IP的机器允许访问数据库。

pg_hba.conf 文件示例:

cat pg_hba.conf
# 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
host    all             all             0/0                     md5
# 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

## ip/数值参数说明
ip/32:表示只允许该ip地址访问,如:192.168.1.1
host    all       all         192.168.1.1/32      md5

ip/24:表示允许一个ip段之间的地址访问,如:192.168.1.1~192.168.1.255
host    all       all         192.168.1.0/24      md5

ip/16:表示允许两个ip段之间的地址访问,如:192.168.1.1~192.168.255.255
host    all       all         192.168.0.0/16      md5

ip/8:表示允许所有ip段之间的地址访问,如:192.1.1.1~192.255.255.255
host    all       all         192.0.0.0/8         md5

ip/0:表示允许所有ip地址访问
host    all       all         0.0.0.0/0           md5

二、认证方式

2.1.trust

无条件的允许连接。
这种方法允许任何可以与PostgreSQL服务器连接的用户以任意PostgreSQL数据库用户身份登入,而不需要口令或者其他认证。
此方式一般与UNIX域套接字的连接认证组合使用,对于单用户的本地连接是非常安全和方便的。
为了防止系统其他普通用户连接到数据库,可以设置套接字文件(/tmp/.s.PGSQL.5432)的权限限制访问。
可以设置unix_socket_directories和unix_socket_permissions参数(重启生效)或操作系统层面设置 chmod 770 .s.PGSQL.5432。

## 配置示例
cat pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             0/0                     trust

## 使更改生效
pg_ctl reload

## 验证
[postgres@postgresql ~]$ psql 
psql (15.4)
Type "help" for help.

postgres=# 

[postgres@postgresql ~]$ psql -h 192.168.80.239 -p 5432 postgres postgres
psql (15.4)
Type "help" for help.

postgres=# 

2.2.md5

连接时需要提供口令进行验证,口令以md5方式加密,此方式安全性较高。

## 配置示例
cat pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             0/0                     md5

## 使更改生效
pg_ctl reload

## 验证
[postgres@postgresql ~]$ psql 
Password for user postgres: 
[postgres@postgresql ~]$ psql -h 192.168.80.239 -p 5432 postgres postgres
Password for user postgres:

2.3.password

连接时需要提供口令进行验证,口令以明文的形式在网络上传输,存在一定的安全隐患,不建议使用。

## 配置示例
cat pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     password
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             0/0                     password

## 使更改生效
pg_ctl reload

## 验证
[postgres@postgresql ~]$ psql 
Password for user postgres:
[postgres@postgresql ~]$ psql -h 192.168.80.239 -p 5432 postgres postgres
Password for user postgres:

2.4.reject

无条件的拒绝连接。
可以阻止一个特定的主机连接,而允许其他主机连接数据库,相当于设置了访问黑名单。

## 配置示例
cat pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             192.168.10.132          reject

## 使更改生效
pg_ctl reload

## 验证
会出现类似的错误现象:FATAL: pg hba.conf rejects connection for host "192.168.10.132",user "postgres", database "postgres", no encryption

2.5.ident

ident认证方式是通过联系客户端的ident服务器获取客户端操作系统的用户名,并且检查它是否匹配被请求的数据库用户名。
ident认证只能在TCP/IP连接上使用。当为本地连接指定这种认证方式时,将用peer认证来代替。
服务器为了确定接收到的连接请求确实是客户端机器上的某个用户发起的,而不是这台机器上其他用户发起的假冒请求,会向客户端机器上的ident服务发起请求,让ident服务查看此TCP连接是否是该用户发起的,如果不是,则认证失败。
如果客户端通过本地连接连接到服务器,因为客户端与服务器在同一台机器上,数据库服务器可以直接检查客户端用户的操作系统用户身份,就不需要向ident服务发送请求进行判断了。

实际上每个类 Unix 操作系统都带着一个默认监听 TCP 113 端口的 ident 服务器。这个过程的缺点是它依赖于客户端的完整性:如果客户端机器不可信或者被攻破,攻击者可能在 113 端口上运行任何程序并且返回他们选择的任何用户。因此这种认证方法只适用于封闭的网络,这样的网络中的每台客户端机器都处于严密的控制下并且数据库和操作系统管理员操作时可以方便地联系。换句话说,你必须信任运行 ident 服务器的机器。

此验证方式需要配合pg_ident.conf使用。
(远程操作系统的当前用户名和数据库的用户名一致时,可以直接使用此用户名登录而不需要密码。)

## 安装oidentd服务
yum install -y oidentd
或
rpm -ivh oidentd-2.0.8-20.el7.x86_64.rpm 

## 开启oidentd服务
systemctl start oidentd.service
systemctl status oidentd.service
systemctl enable oidentd.service

ss -tlnp | grep 113
LISTEN     0      128         *:113         *:*           users:(("oidentd",pid=19188,fd=4))

## 配置示例
cat pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             0.0.0.0/0               ident map=cs

cat pg_ident.conf
# MAPNAME       SYSTEM-USERNAME         PG-USERNAME
cs              postgres                postgres
cs              admin                   test

## 使更改生效
pg_ctl reload

## 验证
[root@postgresql tmp]# su - postgres
[postgres@postgresql ~]$ psql -U postgres -h 192.168.80.239 -p 5432
psql (15.4)
Type "help" for help.
 
postgres=# select user;
   user   
----------
 postgres
(1 row)

[root@postgresql ~]# su - admin
[admin@postgresql ~]$ psql -U test -h 192.168.80.239 -p 5432 postgres
psql (15.4)
Type "help" for help.

postgres=> select user;
 user 
------
 test
(1 row)

2.6.peer

从操作系统获得客户端的操作系统用户,并且检查它是否匹配被请求的数据库用户名,这只对本地连接可用。
数据库端允许客户端上的特定操作系统用户连接到数据库。
这种认证方式的使用场景如下:客户端是主机上某个操作系统用户,已经通过了操作系统的身份认证,是数据库服务器可以信任的用户,不需要在数据库层面再次检测其身份。

## 配置示例
cat pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     peer map=cs
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust

cat pg_ident.conf
# MAPNAME       SYSTEM-USERNAME         PG-USERNAME
cs              postgres                postgres
cs              admin                   test

## 使更改生效
pg_ctl reload

## 验证
[root@postgresql tmp]# su - admin
[admin@postgresql ~]$ psql -U test postgres
psql (15.4)
Type "help" for help.

postgres=> select user;
 user 
------
 test
(1 row)

http://www.niftyadmin.cn/n/5118158.html

相关文章

2023-10-24

2023年1024,祝大佬们早日财富自由!

UG\NX二次开发 关闭显示,隐藏创建过程,提高运行效率

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 今天UG学废了吗 订阅本专栏,非常感谢。 简介 UG\NX二次开发 关闭显示,隐藏创建过程,提高运行效率 代码 #include "me.hpp" #include <uf_d…

TailwindCSS使用并开启JIT(vue2)

前提vue2工程 安装 不要安装官网最新版&#xff0c;因为vue2还不支持 npm install -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9init 配置 npx tailwindcss init -p这样根目录多了两个文件 tailwind.config.js和postcss.config.js main.js 引…

应用系统集成-企业集成模式(EIP)

应用系统集成-企业集成模式&#xff08;EIP&#xff09; 无论是系统间集成或是系统内部组件之间通讯&#xff0c;消息&#xff08;信息流&#xff09;都是系统设计最重要的因素。EIP将详细的讲述了从消息的角度进行集成设计考虑方方面面&#xff0c;是系统设计重要的参考资料。…

深入剖析Mysql读写分离:揭示常见坑点及应对策略,打造可靠数据库系统

一、主从架构 为什么我们要进行读写分离&#xff1f;个人觉得还是业务发展到一定的规模&#xff0c;驱动技术架构的改革&#xff0c;读写分离可以减轻单台服务器的压力&#xff0c;将读请求和写请求分流到不同的服务器&#xff0c;分摊单台服务的负载&#xff0c;提高可用性&am…

21.4 Python 使用GeoIP2地图定位

GeoIP2是一种IP地址定位库&#xff0c;它允许开发人员根据IP地址查找有关位置和地理位置的信息。它使用MaxMind公司的IP地址数据库&#xff0c;并提供一个方便的Python API。GeoIP2可以用于许多不同的应用程序&#xff0c;例如网站分析、广告定位和身份验证。GeoIP2提供了许多不…

微店商品详情API接口(标题|主图|SKU|价格|库存..)

微店商品详情接口的应用场景有很多&#xff0c;以下为您推荐几种&#xff1a; 电商平台集成&#xff1a;如果想要实现商品查询、购买、支付等功能&#xff0c;提高自身平台的电商能力&#xff0c;可以将微店API接口集成到自己的电商网站或应用程序中。 第三方开发者插件&#…

Non-constant range: argument must be an integer literal

更新 Xcode IDE 后 ForEach 方法抛出了如下异常 Non-constant range: argument must be an integer literal 新增了指向性 id 参数 init(_:content:) 原始方法 ForEach(0 ..< pickerTitleColors.count) {Text(self.pickerTitleColors[$0]).tag($0).foregroundColor(self.…