Skip to content

PostgreSQL 对等身份验证详解

概述

对等身份验证(Peer Authentication)是 PostgreSQL 提供的一种基于操作系统用户身份的认证方法。它通过从内核获取客户端的操作系统用户名,并将其作为允许的数据库用户名来实现身份验证。

INFO

对等身份验证仅适用于本地连接,无法用于网络连接。

工作原理

对等身份验证的核心机制是利用操作系统的安全特性来验证用户身份:

验证流程

  1. 进程识别:PostgreSQL 服务器通过系统调用获取客户端进程的所有者
  2. 用户名提取:从操作系统获取真实的用户名
  3. 映射检查:如果配置了用户名映射,则进行转换
  4. 权限验证:检查用户是否有权限连接指定数据库
  5. 连接建立:验证通过后建立数据库连接

配置选项

map 参数

map 参数允许在系统用户名和数据库用户名之间进行映射,提供了灵活的用户名转换机制。

语法格式

sql
# pg_hba.conf 配置示例
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer map=mymap

映射表配置示例

pg_ident.conf 文件中定义映射关系:

bash
# MAPNAME       SYSTEM-USERNAME         PG-USERNAME
mymap           john                    john_db
mymap           admin                   postgres
mymap           /^web_(.*)$            web_user

配置说明:

  • mymap:映射表名称
  • john:操作系统用户名
  • john_db:对应的 PostgreSQL 用户名
  • 支持正则表达式模式匹配

系统兼容性

对等身份验证依赖于操作系统提供的特定功能:

操作系统支持机制可用性
LinuxSO_PEERCRED 套接字参数✅ 完全支持
macOSgetpeereid() 函数✅ 完全支持
FreeBSDgetpeereid() 函数✅ 完全支持
OpenBSDgetpeereid() 函数✅ 完全支持
NetBSDgetpeereid() 函数✅ 完全支持
Solaris类似机制✅ 完全支持
Windows-❌ 不支持

WARNING

对等身份验证在 Windows 系统上不可用,因为 Windows 缺少必要的系统调用支持。

实际应用场景

场景 1:开发环境快速访问

在开发环境中,开发者经常需要快速访问本地数据库:

bash
# 当前操作系统用户为 developer
# 直接连接数据库,无需密码
psql -d myproject

配置要求:

sql
-- pg_hba.conf
local   all             developer                               peer

优势:

  • 无需记住密码
  • 开发环境快速启动
  • 与操作系统用户权限一致

场景 2:系统服务自动化

系统服务需要自动连接数据库执行维护任务:

bash
#!/bin/bash
# 备份脚本 - 以 backup 用户身份运行
# 文件路径:/etc/cron.daily/db-backup

# 自动获取当前用户身份(backup)
pg_dump -h localhost -d production > /backup/daily_$(date +%Y%m%d).sql

配置示例:

sql
-- pg_hba.conf
local   production      backup                                  peer

-- 创建备份用户
CREATE USER backup;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup;

场景 3:多用户环境的权限隔离

在多用户开发服务器上实现权限隔离:

sql
-- pg_hba.conf 配置
local   dev_alice       alice                                   peer
local   dev_bob         bob                                     peer
local   shared_db       all                                     peer map=dev_map
bash
# pg_ident.conf 映射配置
# MAPNAME    SYSTEM-USERNAME    PG-USERNAME
dev_map      alice              shared_user
dev_map      bob                shared_user
dev_map      admin              postgres

实现效果:

  • Alice 只能访问 dev_alice 数据库
  • Bob 只能访问 dev_bob 数据库
  • 两人都可以以 shared_user 身份访问共享数据库
  • 管理员可以访问所有数据库

安全考虑

优势

  1. 强身份验证:基于操作系统级别的身份验证
  2. 无密码泄露:不需要在配置文件中存储密码
  3. 简化管理:与操作系统用户管理集成
  4. 审计跟踪:可以追踪到具体的系统用户

限制和风险

  1. 本地限制:仅适用于本地连接
  2. 用户管理复杂性:需要同时管理系统用户和数据库用户
  3. 权限继承:系统用户的权限可能影响数据库安全

WARNING

安全提醒在生产环境中使用对等身份验证时,确保:

  • 严格控制系统用户的创建和权限
  • 定期审查用户映射配置
  • 监控数据库访问日志

配置最佳实践

1. 最小权限原则

sql
-- 为特定用途创建专用用户
CREATE USER app_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_reader;

-- 限制特定数据库访问
-- pg_hba.conf
local   app_db          app_reader                              peer

2. 映射表管理

bash
# pg_ident.conf - 使用描述性映射名称
# 应用服务映射
app_services    nginx_user          web_reader
app_services    php_user            web_reader

# 管理员映射
admin_access    root                postgres
admin_access    dba_user            postgres

3. 日志和监控

sql
-- 启用连接日志
log_connections = on
log_disconnections = on
log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h '

故障排除

常见问题

问题 1:连接被拒绝

bash
psql: FATAL: Peer authentication failed for user "myuser"

解决步骤:

  1. 检查当前系统用户:
bash
whoami
  1. 验证 pg_hba.conf 配置:
bash
# 查看配置
sudo -u postgres psql -c "SHOW hba_file;"
sudo cat /etc/postgresql/13/main/pg_hba.conf | grep peer
  1. 检查用户映射(如果使用):
bash
sudo cat /etc/postgresql/13/main/pg_ident.conf

问题 2:映射不生效

调试方法:

bash
# 测试映射
sudo -u postgres psql -c "SELECT * FROM pg_hba_file_rules WHERE type = 'local';"

# 检查映射表
sudo -u postgres psql -c "SELECT * FROM pg_ident_file_mappings;"

与其他认证方法比较

认证方法适用场景安全性配置复杂度网络支持
peer本地开发/服务
md5/scram网络连接中-高
trust开发环境
cert高安全要求很高

总结

对等身份验证是一种安全且便捷的本地数据库访问方法,特别适合:

  • 开发环境:快速、安全的本地访问
  • 系统服务:自动化脚本和服务的数据库连接
  • 管理任务:基于操作系统用户的权限管理

通过合理配置用户映射和权限控制,对等身份验证可以在保证安全性的同时,大大简化本地数据库的访问管理。

TIP

推荐做法在配置对等身份验证时,建议结合其他认证方法使用,为不同的访问场景提供灵活的安全策略。