文档首页/ 云数据库 RDS/ 最佳实践/ RDS for PostgreSQL/ RDS for PostgreSQL安全最佳实践
更新时间:2024-09-30 GMT+08:00

RDS for PostgreSQL安全最佳实践

PostgreSQL数据库在可靠性、稳定性、数据一致性等获得了业内极高的声誉,已成为许多企业的首选开源关系数据库,业界简称PG。RDS for PostgreSQL是一种基于云计算平台的即开即用、稳定可靠、弹性伸缩、便捷管理的在线云数据库服务。

为加强RDS for PostgreSQL数据库安全性,本文将从以下几个维度给出建议,您可以根据业务需要在本指导的基础上进行安全配置。

配置数据库的最大连接数

max_connections 决定了数据库的最大并发连接数。增加这个参数值可能引起RDS for PostgreSQL请求更多的System V共享内存或者信号量,会导致超出操作系统默认配置允许的值。请根据业务的复杂度,合理配置max_connections,具体可参考实例使用规范

配置客户端认证超时时间

authentication_timeout控制完成客户端认证的时间上限,单位是秒。该参数可以防止客户端长时间占用连接通道,默认是60s。如果在指定的时间内没有完成认证,连接将被强制关闭。该超时时间的配置是为了增强PostgreSQL的安全性。

配置SSL连接和加密算法

尽可能利用SSL进行TCP/IP连接,使用SSL加密通信可确保客户端和服务器之间的所有通信都经过加密,防止数据被泄露和篡改,确保数据的完整性。在设置SSL加密时,服务端需要配置安全的TLS协议和加密算法,推荐使用TLSv1.2协议,加密算法推荐使用EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EDH+aRSA+AESGCM:EDH+aDSS+AESGCM:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!SRP:!RC4,具体请参考SSL连接

可通过修改参数“ssl_min_protocol_version”配置TLS协议,修改参数“ssl_ciphers”配置加密算法。

配置密码加密功能

密码必须要加密。使用CREATE USER或者ALTER ROLE修改密码时候,默认使用加密的方式,推荐使用scram-sha-256,可通过修改参数“password_encryption”进行配置。

MD5选项仅供与低版本兼容场景使用,新建数据库实例默认使用scram-sha-256。

参数“password_encryption”修改后需要重置密码后才能生效。

配置服务器拒绝带反斜杠转义的引号

参数“backslash_quote”控制字符串里面引号是否可以被\'代替。推荐使用SQL标准方法,表示一个引号是写两遍 (''),如果客户端代码不能正确的转义,可能发生SQL注入攻击。建议配置参数“backslash_quote”值为“safe_encoding”,拒绝带反斜杠转义的引号的查询,可以避免SQL注入的风险。

定期检查并删除业务不再使用的角色

对于每个查询出来的角色,检查是否必须存在,任何未知的角色都需要被审视,确保每个角色都是正常使用的,否则删除这些角色。可通过如下命令进行查询:

SELECT rolname FROM pg_roles;

建议回收public模式的所有权限

public模式是默认的模式,所有用户都可以访问其中的对象,包括表、函数、视图等。如果public模式中的对象被授予了权限,那么所有用户都可以访问这些对象,这可能会导致安全漏洞。root用户可通过如下命令回收权限:

revoke all on schema public from public;

设置合理的用户角色密码有效期

当创建角色时候,使用VALID UNTIL关键字设置过多长时间后角色的密码不再有效。如果这个关键字被忽略,密码会长期有效。建议定期更改密码,例如每三个月更改一次密码。可通过如下命令进行设置:

CREATE ROLE name WITH PASSWORD 'password' VALID UNTIL 'timestamp';

检查是否设置密码有效期:

SELECT rolname,rolvaliduntil FROM pg\_roles WHERE rolsuper = false AND rolvaliduntil IS NULL;

配置日志级别记录发生错误的SQL语句

参数“log_min_error_statement”控制哪些引起错误的SQL语句记录到服务器日志中。对于大于等于当前配置等级的SQL语句消息,会记录到日志里。有效的值包括debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal, panic。“log_min_error_statement”至少配置为“error”,具体可参考日志配置管理

确保数据库帐号的最低权限

RDS for PostgreSQL支持“基于角色”的方法授予帐号对数据和命令的访问权限。建议管理员结合业务需要,遵从最低授权原则,创建合适的数据库帐号,对帐号进行授权。如果发现存在不符合该角色的帐号权限,请结合业务需要,对帐号权限进行更新或者删除。由于PostgreSQL存在一些内置帐号,用于给数据库实例提供完善的后台运维管理服务,禁止用户使用和删除。

开启备份功能

创建云数据库RDS实例时,系统默认开启自动备份策略,默认自动备份保留7天,可根据业务需要调整备份保留时长。RDS for PostgreSQL实例支持自动备份手动备份,您可以定期对数据库进行备份,当数据库故障或数据损坏时,可以通过备份文件恢复数据库,从而保证数据可靠性,详情请参见数据备份

开启数据库审计功能

通过将PostgreSQL审计扩展(pgAudit)与RDS for PostgreSQL数据库实例一起使用,可以捕获审计员通常需要或满足法规要求的详细记录。例如,您可以设置pgAudit扩展来跟踪对特定数据库和表所做的更改、记录进行更改的用户以及许多其他详细信息。pgAudit默认不开启,根据业务需要开启插件。具体配置可参考使用pgAudit插件

避免绑定EIP直接通过公网访问RDS for PostgreSQL

避免RDS for PostgreSQL部署在公网或者DMZ里,应该将RDS for PostgreSQL部署在华为云内部网络,使用路由器或者防火墙技术把RDS for PostgreSQL保护起来,避免直接绑定EIP方式从公网访问RDS for PostgreSQL。通过这种方式防止未授权的访问及DDos攻击等。建议解绑弹性公网IP外部链接,如果您的业务必须绑定EIP,请务必通过设置安全组规则限制访问数据库的源IP。

数据库版本更新到最新版本

PostgreSQL社区当前9.5/9.6/10版本已经EOL,社区已不再维护,云上9.5/9.6版本已经发布EOS公告。使用较老的版本可能存在安全风险,运行最新版本的软件可以避免受到某些攻击。如果业务需要,可通过升级内核小版本或者使用转储与还原升级大版本

配置账号认证失败延迟时间

PostgreSQL数据库默认内置了auth_delay插件,auth_delay会使服务器在返回认证失败之前短暂停止,使得暴力破解数据库密码更难。可通过修改RDS for PostgreSQL实例参数设置auth_delay.milliseconds参数(该参数为返回认证失败之前等待的毫秒数)延迟账号登录认证失败的等待时间,缺省值是0。