RDS for PostgreSQL安全最佳实践
PostgreSQL数据库在可靠性、稳定性、数据一致性等获得了业内极高的声誉,已成为许多企业的首选开源关系数据库,业界简称PG。RDS for PostgreSQL是一种基于云计算平台的即开即用、稳定可靠、弹性伸缩、便捷管理的在线云数据库服务。
为加强RDS for PostgreSQL数据库安全性,本文将从以下几个维度给出建议,您可以根据业务需要在本指导的基础上进行安全配置。
- 配置数据库的最大连接数
- 配置客户端认证超时时间
- 配置SSL连接和加密算法
- 配置密码加密功能
- 配置服务器拒绝带反斜杠转义的引号
- 定期检查并删除业务不再使用的角色
- 建议回收public模式的所有权限
- 设置合理的用户角色密码有效期
- 配置日志级别记录发生错误的SQL语句
- 确保数据库帐号的最低权限
- 开启备份功能
- 开启数据库审计功能
- 避免绑定EIP直接通过公网访问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选项仅供与低版本兼容场景使用,新建数据库实例默认使用sha-256。
![](https://support.huaweicloud.com/bestpractice-rds/public_sys-resources/notice_3.0-zh-cn.png)
参数“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。