Skip to content

PostgreSQL 安全相关参数

PostgreSQL提供了丰富的安全参数配置,用于保护数据库系统的各个层面。合理配置这些参数,可以显著提高数据库系统的安全性,防范各种安全威胁。本文档详细介绍PostgreSQL安全相关参数,包括认证授权、网络安全、数据保护、审计日志等,帮助DBA构建安全可靠的PostgreSQL数据库系统。

认证与授权参数

认证与授权参数控制PostgreSQL的用户认证和权限管理,是数据库安全的基础。

password_encryption

默认值

  • PostgreSQL 14+:scram-sha-256
  • PostgreSQL 13及以下:md5

说明:指定存储密码的加密方式。scram-sha-256是一种更安全的加密方式,支持加盐和迭代次数,比md5更难破解。

生产环境推荐值

  • 所有版本都建议设置为scram-sha-256

适用场景与调优建议

  • 新建数据库:直接使用scram-sha-256
  • 现有数据库:逐步迁移到scram-sha-256,先修改配置,再更新用户密码
  • 兼容性要求:如果需要兼容旧客户端,可以暂时使用md5,但建议尽快迁移

性能影响

  • scram-sha-256比md5稍微增加一些CPU开销,但安全性显著提高
  • 对于现代服务器,CPU开销可以忽略

authentication_timeout

默认值60s

说明:认证超时时间,超过此时间未完成认证的连接将被断开。

生产环境推荐值

  • 30s-60s

适用场景与调优建议

  • 生产环境:设置为30-60秒,防止认证过程占用过多资源
  • 高安全要求:设置为更短时间,减少攻击窗口
  • 低安全要求:可以保持默认值

性能影响

  • 对数据库性能影响很小,主要影响认证过程

max_connections

默认值100

说明:数据库允许的最大并发连接数。

生产环境推荐值

  • 根据服务器资源和业务需求调整,建议设置为实际需要的最大值
  • 小型服务器:50-100
  • 中型服务器:100-200
  • 大型服务器:200-500

适用场景与调优建议

  • OLTP应用:适当增加,支持更多并发连接
  • OLAP应用:适当减少,为查询留出更多资源
  • 资源受限服务器:根据CPU和内存调整

安全影响

  • 过高的值可能导致资源耗尽,影响数据库可用性
  • 过低的值可能导致合法连接被拒绝
  • 建议结合连接池使用,减少实际连接数

网络安全参数

网络安全参数控制PostgreSQL的网络访问,防止未授权的网络访问。

listen_addresses

默认值localhost

说明:PostgreSQL监听的网络地址,指定允许哪些IP地址的连接。

生产环境推荐值

  • 专用数据库服务器'192.168.1.100'(仅监听内部IP)
  • 多网卡服务器'192.168.1.100,10.0.0.100'(监听多个内部IP)
  • 禁止远程连接'localhost'(仅允许本地连接)

适用场景与调优建议

  • 生产环境:仅监听必要的内部IP地址
  • 开发环境:可以设置为'*',允许所有连接
  • 安全要求高:设置为具体的IP地址,避免使用'*'

安全影响

  • 使用'*'会增加安全风险,建议仅监听必要的IP地址
  • 结合防火墙使用,进一步限制访问

port

默认值5432

说明:PostgreSQL监听的端口号。

生产环境推荐值

  • 建议使用非默认端口,如54335434

适用场景与调优建议

  • 生产环境:使用非默认端口,降低自动扫描工具的攻击风险
  • 多实例部署:每个实例使用不同的端口
  • 安全要求高:结合防火墙使用,只允许特定端口的访问

安全影响

  • 使用默认端口会增加被自动扫描工具发现的风险
  • 使用非默认端口是一种简单有效的安全措施

ssl

默认值off

说明:控制是否启用SSL连接,加密网络传输数据。

生产环境推荐值

  • on

适用场景与调优建议

  • 生产环境:必须启用SSL,加密所有网络传输
  • 内部网络:建议启用SSL,防止内部网络监听
  • 外部网络:必须启用SSL,确保数据安全

安全影响

  • 优点:加密网络传输,防止数据泄露和篡改
  • 缺点:增加少量CPU开销
  • 对于现代服务器,CPU开销可以忽略,而安全性收益显著

ssl_cert_file

默认值server.crt

说明:SSL证书文件路径。

生产环境推荐值

  • 使用由可信CA签发的证书
  • 定期更新证书,避免证书过期

适用场景与调优建议

  • 生产环境:使用可信CA签发的证书
  • 测试环境:可以使用自签名证书
  • 证书文件应保存在安全的位置,限制访问权限

安全影响

  • 使用可信CA签发的证书可以防止中间人攻击
  • 定期更新证书可以避免证书过期导致的连接失败

ssl_key_file

默认值server.key

说明:SSL私钥文件路径。

生产环境推荐值

  • 确保私钥文件的访问权限严格,仅允许PostgreSQL进程访问
  • 定期更换私钥,提高安全性

适用场景与调优建议

  • 私钥文件权限应设置为600,仅允许文件所有者访问
  • 私钥应与证书匹配,避免配置错误

安全影响

  • 私钥泄露会导致SSL加密失效,必须严格保护
  • 定期更换私钥可以降低私钥泄露的风险

数据保护参数

数据保护参数用于保护数据库中的数据,防止数据损坏和泄露。

data_checksums

默认值

  • PostgreSQL 12+:on(创建数据库时默认启用)
  • PostgreSQL 11及以下:off

说明:控制是否启用数据校验和,用于检测数据块损坏。

生产环境推荐值

  • 新建数据库时必须启用on
  • 现有数据库可以通过pg_checksums工具启用(需要停机)

适用场景与调优建议

  • 新建数据库:直接启用数据校验和
  • 现有数据库:在维护窗口通过pg_checksums工具启用
  • 存储不可靠:必须启用数据校验和,及时发现数据损坏

性能影响

  • 增加约1-3%的CPU开销
  • 对于现代服务器,性能影响很小,而数据安全性显著提高

wal_level

默认值replica

说明:控制WAL日志的详细程度,影响数据恢复和复制功能。

生产环境推荐值

  • 主从复制replica
  • 逻辑复制logical

适用场景与调优建议

  • 主从架构:使用replica,支持物理复制
  • 数据同步需求:使用logical,支持逻辑复制
  • 高可靠性要求:使用更高的wal_level,确保数据可恢复

安全影响

  • 适当的wal_level可以确保数据的可恢复性,防止数据丢失
  • 过低的wal_level可能导致数据无法完整恢复

password_encryption

默认值

  • PostgreSQL 14+:scram-sha-256
  • PostgreSQL 13及以下:md5

说明:控制密码的加密方式。

生产环境推荐值

  • scram-sha-256

适用场景与调优建议

  • 新建数据库:直接使用scram-sha-256
  • 现有数据库:逐步迁移到scram-sha-256
  • 兼容性要求:如果需要兼容旧客户端,可以暂时使用md5

安全影响

  • scram-sha-256比md5更安全,支持加盐和迭代次数
  • md5容易受到彩虹表攻击,不建议在生产环境使用

审计与日志参数

审计与日志参数用于记录数据库活动,便于安全审计和故障排查。

log_statement

默认值none

说明:控制记录哪些SQL语句到日志中。

生产环境推荐值

  • 生产环境'ddl'(仅记录DDL语句)
  • 安全要求高'mod'(记录所有修改数据的语句)
  • 调试环境'all'(记录所有语句)

适用场景与调优建议

  • 生产环境:建议记录DDL语句,便于审计和故障排查
  • 敏感数据操作:记录修改数据的语句,便于追溯
  • 性能要求高:避免使用'all',会产生大量日志

安全影响

  • 适当的日志记录可以帮助审计和追溯安全事件
  • 过多的日志记录会影响性能,应根据实际需求调整

log_connections

默认值off

说明:控制是否记录数据库连接事件。

生产环境推荐值

  • on

适用场景与调优建议

  • 生产环境:启用连接日志,便于审计和安全监控
  • 高并发环境:连接日志会增加少量开销,根据实际情况调整

安全影响

  • 连接日志可以帮助识别未授权访问尝试
  • 结合log_disconnections使用,可以完整记录连接生命周期

log_disconnections

默认值off

说明:控制是否记录数据库断开连接事件。

生产环境推荐值

  • on

适用场景与调优建议

  • 生产环境:启用断开连接日志,便于审计和安全监控
  • 结合log_connections使用,可以完整记录连接生命周期

安全影响

  • 完整的连接日志可以帮助识别异常连接模式
  • 便于追溯安全事件,如暴力破解尝试

log_min_duration_statement

默认值-1(不记录)

说明:记录执行时间超过指定毫秒数的SQL语句。

生产环境推荐值

  • 5000(5秒)

适用场景与调优建议

  • 生产环境:记录执行时间超过5秒的语句,便于性能优化和安全审计
  • OLTP应用:可以设置为更短时间,如2秒
  • OLAP应用:可以设置为更长时间,如10秒

安全影响

  • 慢查询日志可以帮助识别异常查询,如长时间运行的恶意查询
  • 结合其他日志参数使用,全面监控数据库活动

访问控制参数

访问控制参数用于限制数据库的访问,防止未授权的操作。

max_connections

默认值100

说明:数据库允许的最大并发连接数。

生产环境推荐值

  • 根据服务器资源和业务需求调整
  • 小型服务器:50-100
  • 中型服务器:100-200
  • 大型服务器:200-500

适用场景与调优建议

  • 资源受限服务器:设置较小的值,防止资源耗尽
  • 高并发应用:设置较大的值,支持更多并发连接
  • 结合连接池使用,减少实际连接数

安全影响

  • 过高的值可能导致资源耗尽,影响数据库可用性
  • 过低的值可能导致合法连接被拒绝

max_prepared_transactions

默认值0

说明:允许的最大准备事务数,控制两阶段提交的使用。

生产环境推荐值

  • 需要两阶段提交:设置为与max_connections相同的值
  • 不需要两阶段提交:保持默认值0

适用场景与调优建议

  • 分布式事务:需要启用两阶段提交,设置适当的值
  • 普通应用:保持默认值,避免不必要的资源消耗

安全影响

  • 过高的值可能导致资源耗尽
  • 过低的值可能限制分布式事务的使用

track_functions

默认值none

说明:控制是否跟踪函数调用,用于性能分析和审计。

生产环境推荐值

  • none(默认值)
  • 需要性能分析pl(仅跟踪过程语言函数)
  • 需要全面审计all(跟踪所有函数)

适用场景与调优建议

  • 生产环境:建议保持默认值,避免性能开销
  • 性能调试:临时设置为plall

安全影响

  • 跟踪函数调用会增加性能开销
  • 对于安全审计,可能需要跟踪特定函数的调用

不同环境的安全配置建议

开发环境

配置要点

  • 允许更宽松的访问,方便开发测试
  • 启用详细日志,便于调试
  • 适当降低安全要求,提高开发效率

配置示例

bash
# 开发环境安全配置
listen_addresses = '*'  # 允许所有连接
port = 5432  # 使用默认端口
max_connections = 200  # 允许更多连接
log_statement = 'all'  # 记录所有语句
log_min_duration_statement = 0  # 记录所有语句
ssl = off  # 开发环境可以暂时关闭SSL
password_encryption = 'scram-sha-256'  # 仍使用强密码加密

测试环境

配置要点

  • 接近生产环境的安全配置
  • 启用SSL连接
  • 记录必要的日志
  • 限制不必要的访问

配置示例

bash
# 测试环境安全配置
listen_addresses = '127.0.0.1,192.168.1.0/24'  # 允许本地和内部网络连接
port = 5433  # 使用非默认端口
max_connections = 150  # 限制连接数
log_statement = 'mod'  # 记录修改数据的语句
log_min_duration_statement = 100  # 记录执行时间超过100ms的语句
ssl = on  # 启用SSL
password_encryption = 'scram-sha-256'  # 使用强密码加密
authentication_timeout = 60  # 认证超时时间

生产环境

配置要点

  • 严格的安全配置
  • 仅允许必要的访问
  • 启用所有安全功能
  • 记录必要的日志用于审计
  • 定期审查和更新配置

配置示例

bash
# 生产环境安全配置
listen_addresses = '192.168.1.100'  # 仅监听内部IP
port = 5433  # 使用非默认端口
max_connections = 100  # 限制连接数
log_statement = 'ddl'  # 记录DDL语句
log_min_duration_statement = 5000  # 记录执行时间超过5秒的语句
ssl = on  # 启用SSL
ssl_cert_file = '/etc/ssl/postgresql/server.crt'  # SSL证书文件
ssl_key_file = '/etc/ssl/postgresql/server.key'  # SSL私钥文件
ssl_ca_file = '/etc/ssl/postgresql/root.crt'  # SSL CA文件
password_encryption = 'scram-sha-256'  # 使用强密码加密
authentication_timeout = 30  # 认证超时时间
data_checksums = on  # 启用数据校验和
wal_level = 'replica'  # 适当的WAL级别
log_connections = on  # 记录连接事件
log_disconnections = on  # 记录断开连接事件

安全配置最佳实践

基本安全措施

  1. 最小权限原则

    • 只授予用户必要的权限
    • 使用角色管理权限,便于统一管理
    • 定期审查和撤销不必要的权限
  2. 定期更新

    • 保持PostgreSQL版本最新,及时修复安全漏洞
    • 定期更新SSL证书
    • 定期更换密码和私钥
  3. 使用非默认配置

    • 使用非默认端口
    • 避免使用默认用户名
    • 禁用不必要的功能
  4. 启用SSL/TLS

    • 加密所有网络传输
    • 使用可信CA签发的证书
    • 配置合适的SSL选项
  5. 配置防火墙

    • 限制只有必要的IP地址可以访问数据库
    • 只允许特定端口的访问
    • 结合网络隔离使用

高级安全措施

  1. 实施网络隔离

    • 将数据库放在专用网络段
    • 使用VLAN或防火墙隔离数据库
    • 限制数据库只能被特定应用服务器访问
  2. 使用连接池

    • 减少实际连接数,降低安全风险
    • 提供连接监控和审计功能
    • 支持连接过滤和认证
  3. 定期审计

    • 审查用户和角色权限
    • 分析日志中的异常连接和操作
    • 检查pg_hba.conf配置
    • 验证安全参数配置
  4. 实施入侵检测

    • 监控数据库活动,识别异常行为
    • 配置告警机制,及时通知安全事件
    • 结合SIEM系统使用,集中管理安全事件
  5. 定期渗透测试

    • 发现潜在安全漏洞
    • 测试安全措施的有效性
    • 验证安全配置的完整性

安全审计建议

  1. 定期审查用户和角色

    • 检查是否有不必要的超级用户
    • 审查角色继承关系
    • 撤销不再需要的用户和角色
  2. 检查pg_hba.conf配置

    • 确保没有不必要的信任规则
    • 验证认证方法的安全性
    • 检查IP地址限制是否合理
  3. 分析日志中的异常连接

    • 检查失败的连接尝试
    • 识别异常的连接模式
    • 审查长时间运行的连接
  4. 检查未使用的数据库对象

    • 识别未使用的表、索引和函数
    • 审查敏感数据的访问权限
    • 检查是否有遗留的测试数据
  5. 验证安全参数配置

    • 检查ssl、password_encryption等关键参数
    • 验证数据校验和是否启用
    • 检查WAL级别是否合适

常见安全问题与解决方案

弱密码问题

问题描述:用户使用弱密码,容易被暴力破解或字典攻击。

解决方案

  1. 使用强密码策略:要求密码包含大小写字母、数字和特殊字符
  2. 启用密码复杂度检查:使用pg_passwordcheck等扩展
  3. 定期更换密码:设置密码有效期,定期强制更换
  4. 使用scram-sha-256加密:比md5更安全的密码加密方式
  5. 禁用默认用户:修改或删除默认的postgres用户密码

未授权访问

问题描述:未授权用户通过网络或其他方式访问数据库。

解决方案

  1. 配置正确的pg_hba.conf规则:使用合适的认证方法,限制访问来源
  2. 限制listen_addresses:仅监听必要的IP地址
  3. 使用防火墙限制访问:只允许特定IP和端口的访问
  4. 禁用不必要的用户和数据库:删除或禁用测试用户和数据库
  5. 启用SSL:加密网络传输,防止中间人攻击

敏感数据泄露

问题描述:敏感数据通过网络传输、日志记录或其他方式泄露。

解决方案

  1. 加密敏感数据:使用pgcrypto等扩展加密敏感字段
  2. 限制访问敏感数据的权限:只授予必要的用户访问权限
  3. 启用审计日志:记录敏感数据的访问和修改
  4. 实施数据脱敏:对非生产环境的敏感数据进行脱敏处理
  5. 限制日志中的敏感信息:配置日志记录,避免记录敏感数据

SQL注入攻击

问题描述:攻击者通过构造恶意SQL语句,执行未授权的数据库操作。

解决方案

  1. 使用参数化查询:避免直接拼接SQL语句
  2. 验证用户输入:对用户输入进行严格验证和过滤
  3. 使用最小权限原则:限制应用用户的权限,避免使用超级用户
  4. 启用statement_timeout:设置合理的语句执行时间限制
  5. 使用应用层防火墙:过滤恶意SQL语句

数据损坏

问题描述:数据库文件损坏,导致数据丢失或不可访问。

解决方案

  1. 启用数据校验和:及时发现数据块损坏
  2. 定期备份数据:确保数据可以恢复
  3. 使用RAID存储:提供硬件级别的数据冗余
  4. 定期运行pg_checksums:检查数据完整性
  5. 监控磁盘健康状态:及时发现磁盘故障

总结

PostgreSQL提供了丰富的安全参数配置,用于保护数据库系统的各个层面。合理配置这些参数,可以显著提高数据库系统的安全性,防范各种安全威胁。

在实际配置中,应根据不同环境的需求,平衡安全性和性能,采取多层次的安全措施。主要包括:

  1. 认证与授权:使用强密码加密,合理配置认证方法和权限
  2. 网络安全:限制监听地址和端口,启用SSL加密
  3. 数据保护:启用数据校验和,适当的WAL级别
  4. 审计与日志:记录必要的日志用于审计和故障排查
  5. 访问控制:限制连接数和资源使用

同时,定期审查和更新安全配置,结合网络隔离、入侵检测、定期审计等措施,可以构建一个安全可靠的PostgreSQL数据库系统,保护敏感数据免受各种安全威胁。

安全是一个持续的过程,需要不断关注新的安全威胁和防护措施,定期更新和改进安全配置,确保数据库系统的安全性和可靠性。