在 PostgreSQL 的 pg_hba.conf配置文件中,peer、ident和 md5是三种不同的认证方法。以下是它们的详细区别:
1. peer 认证方法
特点:
仅适用于本地连接(local connection type)
基于操作系统用户身份进行认证
不需要密码
工作原理:
PostgreSQL 检查连接客户端的操作系统用户名是否与请求的数据库用户名匹配
如果匹配,则允许连接
配置示例:
local all all peer
使用场景:
# 客户端操作系统用户 = postgres,数据库用户 = postgres
sudo -u postgres psql
# 这会成功,因为操作系统用户和数据库用户都是 postgres
# 如果尝试:
sudo -u root psql -U postgres
# 这会失败,因为操作系统用户(root) ≠ 数据库用户(postgres)
2. ident 认证方法
特点:
适用于本地和主机连接
通过 ident 协议检查客户端操作系统的用户身份
不需要密码
比 peer 更灵活,可以配置用户名映射
工作原理:
连接到 ident 服务器(通常运行在客户端)验证用户名
可以使用用户名映射
配置示例:
host all all 127.0.0.1/32 ident
host all all ::1/128 ident
使用场景:
# 允许从本地主机连接,使用 ident 认证
psql -h 127.0.0.1 -U postgres
用户名映射示例:
# 在 pg_ident.conf 中定义映射
# MAPNAME SYSTEM-USERNAME PG-USERNAME
mymap root postgres
mymap wwwuser webuser
# 在 pg_hba.conf 中使用映射
host all all 127.0.0.1/32 ident map=mymap
3. md5 认证方法
特点:
需要密码认证
使用 MD5 哈希传输密码
适用于本地和远程连接
密码在传输前进行哈希,相对安全
工作原理:
客户端发送用户名
服务器发送随机 salt
客户端计算密码的 MD5 哈希并发送
服务器验证哈希值
配置示例:
host all all 0.0.0.0/0 md5
使用场景:
# 需要输入密码
psql -h 192.168.1.100 -U myuser -d mydb
# 密码: ********
三种方法的对比表格
| 特性 | peer | ident | md5 |
| 适用连接类型 |
仅本地 |
本地和主机 |
本地和主机 |
| 是否需要密码 |
否 |
否 |
是 |
| 认证基础 |
操作系统用户 |
ident 协议 |
数据库密码 |
| 安全性 |
中(本地) |
中 |
中(加密传输) |
| 使用复杂度 |
简单 |
中等 |
简单 |
| 远程支持 |
否 |
是 |
是 |
4. scram-sha-256(现代推荐替代 md5)
特点:
最安全的密码认证方法
使用 SCRAM-SHA-256 协议
抵抗各种攻击(包括中间人攻击)
配置示例:
host all all 0.0.0.0/0 scram-sha-256
实际配置示例
开发环境配置:
# TYPE DATABASE USER ADDRESS METHOD
# 本地 socket 连接使用 peer(方便)
local all all peer
# 本地 TCP 连接使用 md5(需要密码)
host all all 127.0.0.1/32 md5
# 局域网连接使用 md5
host all all 192.168.1.0/24 md5
# 远程连接使用更安全的 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
生产环境安全配置:
# 本地管理连接
local all postgres peer
# 应用本地连接
host appdb appuser 127.0.0.1/32 scram-sha-256
# 特定IP的管理连接
host all admin 192.168.1.100/32 scram-sha-256
# 拒绝其他所有连接
host all all 0.0.0.0/0 reject
认证方法选择指南
选择 peer 当:
只有本地连接
客户端和数据库在同一台机器
希望免密码登录
开发环境
选择 ident 当:
需要用户名映射功能
网络环境可控
客户端支持 ident 协议
选择 md5/scram-sha-256 当:
需要远程连接
需要密码认证
生产环境
推荐使用 scram-sha-256(更安全)
修改认证方法后的操作
# 1. 修改 pg_hba.conf
sudo vim /var/lib/pgsql/data/pg_hba.conf
# 2. 重新加载配置(不重启服务)
sudo systemctl reload postgresql
# 或者重启服务
sudo systemctl restart postgresql
# 3. 测试连接
psql -U username -h hostname -d database
总结:对于现代应用,推荐使用 scram-sha-256替代 md5,本地管理连接可以使用 peer,以获得最佳的安全性和便利性平衡。